This is the code for the statistical analysis for “Vowel Acoustics as Predictors of Speech Intelligibility in Dysarthria.”

Loading Packages

remotes::install_github("AllanCameron/geomtextpath")
Downloading GitHub repo AllanCameron/geomtextpath@HEAD
These packages have more recent versions available.
It is recommended to update all of them.
Which would you like to update?

 1: All                                   
 2: CRAN packages only                    
 3: None                                  
 4: cpp11        (0.3.1  -> 0.4.2 ) [CRAN]
 5: colorspace   (2.0-0  -> 2.0-3 ) [CRAN]
 6: rlang        (0.4.11 -> 1.0.2 ) [CRAN]
 7: glue         (1.4.2  -> 1.6.2 ) [CRAN]
 8: crayon       (1.4.1  -> 1.5.1 ) [CRAN]
 9: cli          (3.0.1  -> 3.2.0 ) [CRAN]
10: vctrs        (0.3.8  -> 0.4.1 ) [CRAN]
11: pillar       (1.6.2  -> 1.7.0 ) [CRAN]
12: magrittr     (2.0.1  -> 2.0.3 ) [CRAN]
13: lifecycle    (1.0.0  -> 1.0.1 ) [CRAN]
14: fansi        (0.5.0  -> 1.0.3 ) [CRAN]
15: viridisLite  (0.3.0  -> 0.4.0 ) [CRAN]
16: RColorBrewer (1.1-2  -> 1.1-3 ) [CRAN]
17: R6           (2.5.0  -> 2.5.1 ) [CRAN]
18: farver       (2.0.3  -> 2.1.0 ) [CRAN]
19: withr        (2.4.1  -> 2.5.0 ) [CRAN]
20: tibble       (3.1.3  -> 3.1.6 ) [CRAN]
21: scales       (1.1.1  -> 1.2.0 ) [CRAN]
22: isoband      (0.2.3  -> 0.2.5 ) [CRAN]
23: digest       (0.6.27 -> 0.6.29) [CRAN]
1
cpp11        (0.3.1  -> 0.4.2 ) [CRAN]
colorspace   (2.0-0  -> 2.0-3 ) [CRAN]
rlang        (0.4.11 -> 1.0.2 ) [CRAN]
glue         (1.4.2  -> 1.6.2 ) [CRAN]
crayon       (1.4.1  -> 1.5.1 ) [CRAN]
cli          (3.0.1  -> 3.2.0 ) [CRAN]
vctrs        (0.3.8  -> 0.4.1 ) [CRAN]
pillar       (1.6.2  -> 1.7.0 ) [CRAN]
magrittr     (2.0.1  -> 2.0.3 ) [CRAN]
lifecycle    (1.0.0  -> 1.0.1 ) [CRAN]
fansi        (0.5.0  -> 1.0.3 ) [CRAN]
viridisLite  (0.3.0  -> 0.4.0 ) [CRAN]
RColorBrewer (1.1-2  -> 1.1-3 ) [CRAN]
R6           (2.5.0  -> 2.5.1 ) [CRAN]
farver       (2.0.3  -> 2.1.0 ) [CRAN]
systemfonts  (NA     -> 1.0.4 ) [CRAN]
withr        (2.4.1  -> 2.5.0 ) [CRAN]
tibble       (3.1.3  -> 3.1.6 ) [CRAN]
scales       (1.1.1  -> 1.2.0 ) [CRAN]
isoband      (0.2.3  -> 0.2.5 ) [CRAN]
digest       (0.6.27 -> 0.6.29) [CRAN]
textshaping  (NA     -> 0.3.6 ) [CRAN]
Installing 22 packages: cpp11, colorspace, rlang, glue, crayon, cli, vctrs, pillar, magrittr, lifecycle, fansi, viridisLite, RColorBrewer, R6, farver, systemfonts, withr, tibble, scales, isoband, digest, textshaping

  There are binary versions available but the source versions are later:
yes
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/cpp11_0.4.2.tgz'
Content type 'application/x-gzip' length 304354 bytes (297 KB)
==================================================
downloaded 297 KB

trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/colorspace_2.0-3.tgz'
Content type 'application/x-gzip' length 2623631 bytes (2.5 MB)
==================================================
downloaded 2.5 MB

trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/rlang_1.0.2.tgz'
Content type 'application/x-gzip' length 1777779 bytes (1.7 MB)
==================================================
downloaded 1.7 MB

trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/glue_1.6.2.tgz'
Content type 'application/x-gzip' length 151788 bytes (148 KB)
==================================================
downloaded 148 KB

trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/crayon_1.5.1.tgz'
Content type 'application/x-gzip' length 158468 bytes (154 KB)
==================================================
downloaded 154 KB

trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/cli_3.2.0.tgz'
Content type 'application/x-gzip' length 1151378 bytes (1.1 MB)
==================================================
downloaded 1.1 MB

trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/pillar_1.7.0.tgz'
Content type 'application/x-gzip' length 742687 bytes (725 KB)
==================================================
downloaded 725 KB

trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/magrittr_2.0.3.tgz'
Content type 'application/x-gzip' length 227333 bytes (222 KB)
==================================================
downloaded 222 KB

trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/lifecycle_1.0.1.tgz'
Content type 'application/x-gzip' length 105818 bytes (103 KB)
==================================================
downloaded 103 KB

trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/fansi_1.0.3.tgz'
Content type 'application/x-gzip' length 364286 bytes (355 KB)
==================================================
downloaded 355 KB

trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/viridisLite_0.4.0.tgz'
Content type 'application/x-gzip' length 1296423 bytes (1.2 MB)
==================================================
downloaded 1.2 MB

trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/RColorBrewer_1.1-3.tgz'
Content type 'application/x-gzip' length 53084 bytes (51 KB)
==================================================
downloaded 51 KB

trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/R6_2.5.1.tgz'
Content type 'application/x-gzip' length 82455 bytes (80 KB)
==================================================
downloaded 80 KB

trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/farver_2.1.0.tgz'
Content type 'application/x-gzip' length 1950011 bytes (1.9 MB)
==================================================
downloaded 1.9 MB

trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/systemfonts_1.0.4.tgz'
Content type 'application/x-gzip' length 5900638 bytes (5.6 MB)
==================================================
downloaded 5.6 MB

trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/withr_2.5.0.tgz'
Content type 'application/x-gzip' length 228814 bytes (223 KB)
==================================================
downloaded 223 KB

trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/tibble_3.1.6.tgz'
Content type 'application/x-gzip' length 846334 bytes (826 KB)
==================================================
downloaded 826 KB

trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/isoband_0.2.5.tgz'
Content type 'application/x-gzip' length 3379423 bytes (3.2 MB)
==================================================
downloaded 3.2 MB

trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/digest_0.6.29.tgz'
Content type 'application/x-gzip' length 298444 bytes (291 KB)
==================================================
downloaded 291 KB

trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.0/textshaping_0.3.6.tgz'
Content type 'application/x-gzip' length 1291860 bytes (1.2 MB)
==================================================
downloaded 1.2 MB

The downloaded binary packages are in
    /var/folders/2s/c8b_6s1s5tgcqqt271kpjw4r0000gn/T//RtmpUSDfWl/downloaded_packages
installing the source packages ‘vctrs’, ‘scales’

trying URL 'https://cran.rstudio.com/src/contrib/vctrs_0.4.1.tar.gz'
Content type 'application/x-gzip' length 916782 bytes (895 KB)
==================================================
downloaded 895 KB

trying URL 'https://cran.rstudio.com/src/contrib/scales_1.2.0.tar.gz'
Content type 'application/x-gzip' length 270188 bytes (263 KB)
==================================================
downloaded 263 KB

* installing *source* package ‘vctrs’ ...
** package ‘vctrs’ successfully unpacked and MD5 sums checked
** using staged installation
** libs
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c altrep-rle.c -o altrep-rle.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c altrep.c -o altrep.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c arg-counter.c -o arg-counter.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c arg.c -o arg.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c assert.c -o assert.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c bind.c -o bind.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c c-unchop.c -o c-unchop.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c c.c -o c.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c callables.c -o callables.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c cast-bare.c -o cast-bare.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c cast-dispatch.c -o cast-dispatch.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c cast.c -o cast.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c compare.c -o compare.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c complete.c -o complete.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c conditions.c -o conditions.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c dictionary.c -o dictionary.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c dim.c -o dim.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c empty.c -o empty.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c equal.c -o equal.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c fields.c -o fields.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c fill.c -o fill.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c globals.c -o globals.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c group.c -o group.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c growable.c -o growable.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c hash.c -o hash.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c init.c -o init.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c interval.c -o interval.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c match-joint.c -o match-joint.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c match.c -o match.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c names.c -o names.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c order-collate.c -o order-collate.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c order-groups.c -o order-groups.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c order-sortedness.c -o order-sortedness.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c order-truelength.c -o order-truelength.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c order.c -o order.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c poly-op.c -o poly-op.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c proxy-restore.c -o proxy-restore.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c proxy.c -o proxy.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c ptype-common.c -o ptype-common.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c ptype.c -o ptype.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c ptype2-dispatch.c -o ptype2-dispatch.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c ptype2.c -o ptype2.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c rank.c -o rank.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c rep.c -o rep.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c rlang-dev.c -o rlang-dev.o
clang++ -mmacosx-version-min=10.13 -std=gnu++11 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c rlang-rcc.cpp -o rlang-rcc.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c rlang.c -o rlang.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c runs.c -o runs.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c shape.c -o shape.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c size-common.c -o size-common.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c size.c -o size.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c slice-array.c -o slice-array.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c slice-assign-array.c -o slice-assign-array.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c slice-assign.c -o slice-assign.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c slice-chop.c -o slice-chop.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c slice-interleave.c -o slice-interleave.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c slice.c -o slice.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c split.c -o split.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c subscript-loc.c -o subscript-loc.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c subscript.c -o subscript.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c translate.c -o translate.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c type-data-frame.c -o type-data-frame.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c type-date-time.c -o type-date-time.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c type-factor.c -o type-factor.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c type-info.c -o type-info.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c type-integer64.c -o type-integer64.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c type-tibble.c -o type-tibble.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c typeof2-s3.c -o typeof2-s3.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c typeof2.c -o typeof2.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c unspecified.c -o unspecified.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c utils-dispatch.c -o utils-dispatch.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c utils.c -o utils.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c vctrs-core.c -o vctrs-core.o
clang -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I./rlang  -I/usr/local/include   -fPIC  -Wall -g -O2  -c version.c -o version.o
clang++ -mmacosx-version-min=10.13 -std=gnu++11 -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o vctrs.so altrep-rle.o altrep.o arg-counter.o arg.o assert.o bind.o c-unchop.o c.o callables.o cast-bare.o cast-dispatch.o cast.o compare.o complete.o conditions.o dictionary.o dim.o empty.o equal.o fields.o fill.o globals.o group.o growable.o hash.o init.o interval.o match-joint.o match.o names.o order-collate.o order-groups.o order-sortedness.o order-truelength.o order.o poly-op.o proxy-restore.o proxy.o ptype-common.o ptype.o ptype2-dispatch.o ptype2.o rank.o rep.o rlang-dev.o rlang-rcc.o rlang.o runs.o shape.o size-common.o size.o slice-array.o slice-assign-array.o slice-assign.o slice-chop.o slice-interleave.o slice.o split.o subscript-loc.o subscript.o translate.o type-data-frame.o type-date-time.o type-factor.o type-info.o type-integer64.o type-tibble.o typeof2-s3.o typeof2.o unspecified.o utils-dispatch.o utils.o vctrs-core.o version.o -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
ld: warning: object file (altrep-rle.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (altrep.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (arg.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (arg-counter.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (assert.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (bind.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (c-unchop.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (c.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (callables.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (cast.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (cast-dispatch.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (cast-bare.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (complete.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (compare.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (conditions.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (dictionary.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (dim.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (empty.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (equal.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (fields.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (fill.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (globals.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (group.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (growable.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (hash.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (interval.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (init.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (match-joint.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (match.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (names.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (order-collate.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (order-groups.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (order-sortedness.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (order-truelength.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (order.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (poly-op.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (proxy-restore.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (proxy.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (ptype-common.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (ptype.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (ptype2-dispatch.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (ptype2.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (rank.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (rep.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (rlang-dev.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (rlang.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (runs.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (shape.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (size-common.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (size.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (slice-array.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (slice-assign-array.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (slice-assign.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (slice-chop.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (slice-interleave.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (slice.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (split.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (subscript-loc.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (subscript.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (translate.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (type-data-frame.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (type-date-time.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (type-factor.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (type-info.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (type-integer64.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (type-tibble.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (typeof2-s3.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (typeof2.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (unspecified.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (utils-dispatch.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (utils.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (vctrs-core.o) was built for newer macOS version (12.0) than being linked (10.13)
ld: warning: object file (version.o) was built for newer macOS version (12.0) than being linked (10.13)
installing to /Library/Frameworks/R.framework/Versions/4.0/Resources/library/00LOCK-vctrs/00new/vctrs/libs
** R
** inst
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
*** copying figures
** building package indices
** installing vignettes
** testing if installed package can be loaded from temporary location
** checking absolute paths in shared objects and dynamic libraries
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (vctrs)
* installing *source* package ‘scales’ ...
** package ‘scales’ successfully unpacked and MD5 sums checked
** using staged installation
** R
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
*** copying figures
** building package indices
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (scales)

The downloaded source packages are in
    ‘/private/var/folders/2s/c8b_6s1s5tgcqqt271kpjw4r0000gn/T/RtmpUSDfWl/downloaded_packages’
  
   checking for file ‘/private/var/folders/2s/c8b_6s1s5tgcqqt271kpjw4r0000gn/T/RtmpUSDfWl/remotesa2175ff1c30/AllanCameron-geomtextpath-f11e256/DESCRIPTION’ ...
  
✓  checking for file ‘/private/var/folders/2s/c8b_6s1s5tgcqqt271kpjw4r0000gn/T/RtmpUSDfWl/remotesa2175ff1c30/AllanCameron-geomtextpath-f11e256/DESCRIPTION’ (360ms)

  
─  preparing ‘geomtextpath’:

  
   checking DESCRIPTION meta-information ...
  
✓  checking DESCRIPTION meta-information

  
─  checking for LF line-endings in source and make files and shell scripts

  
─  checking for empty or unneeded directories

  
─  building ‘geomtextpath_0.1.0.9000.tar.gz’

  
   
* installing *source* package ‘geomtextpath’ ...
** using staged installation
** R
** data
*** moving datasets to lazyload DB
** inst
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
*** copying figures
** building package indices
** installing vignettes
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (geomtextpath)

Upload Datasets


Reliability <- rio::import("Prepped Data/Reliability Data.csv")
AcousticData <- rio::import("Prepped Data/AcousticMeasures.csv") %>%
  dplyr::mutate(intDiff = VAS - transAcc)

AcousticData <- AcousticData %>%
  dplyr::filter(!grepl("_rel", Speaker)) %>%
  dplyr::select(c(Speaker, Sex, Etiology, vowel_ED_b, VSA_b, Hull_b, Hull_bVSD_25, Hull_bVSD_50, Hull_bVSD_75, VAS, transAcc))

Listeners <- rio::import("Prepped Data/Listener_Demographics.csv") %>%
  dplyr::select(!c(StartDate:proloficID, Q2.4_6_TEXT, Q3.2_8_TEXT, AudioCheck:EP3))

Listeners$race[Listeners$Q3.3_7_TEXT == "Native American/ African amercing"] <- "Biracial or Multiracial"

Inter-rater Reliability

Two raters (the first two authors) completed vowel segmentation for the speakers. To calculate inter-rater reliability, 20% of the speakers were segmented again by the other rater. Two-way intraclass coefficients were computed for the extracted F1 and F2 from the temporal midpoint of the vowel segments. Since only one set of ratings will be used in the data analysis, we focus on the single ICC results and interpretation. However, we also report the average ICC values to be comprehensive.


## Creating new data frames to calculate ICC for extracted F1 and F2 values

F1_Rel <- Reliability %>%
  dplyr::select(c(F1, F1_rel))

F2_Rel <- Reliability %>%
  dplyr::select(c(F2, F2_rel))
  
## Single ICC for F1
Single_F1 <- irr::icc(F1_Rel, model = "twoway", type = "agreement", unit = "single")

## Average ICC for F1
Average_F1 <- irr::icc(F1_Rel, model = "twoway", type = "agreement", unit = "average")

## Single ICC for F2
Single_F2 <- irr::icc(F2_Rel, model = "twoway", type = "agreement", unit = "single")

## Average ICC for F2
Average_F2 <- irr::icc(F2_Rel, model = "twoway", type = "agreement", unit = "average")

## Inter-rater reliability results and interpretation

print(paste("Single ICC for F1 is ", round(Single_F1$value, digits = 3), ". ", 
            "The 95% CI is [", round(Single_F1$lbound, digits = 3), " - ", round(Single_F1$ubound, digits = 3), "].", sep = ""))
[1] "Single ICC for F1 is 0.866. The 95% CI is [0.837 - 0.89]."
print(paste("Single ICC for F2 is ", round(Single_F2$value, digits = 3), ". ", 
            "The 95% CI is [", round(Single_F2$lbound, digits = 3), " - ", round(Single_F2$ubound, digits = 3), "].", sep = ""))
[1] "Single ICC for F2 is 0.931. The 95% CI is [0.916 - 0.944]."
print(paste("Average ICC for F1 is ", round(Average_F1$value, digits = 3), ". ", 
            "The 95% CI is [", round(Average_F1$lbound, digits = 3), " - ", round(Average_F1$ubound, digits = 3), "].", sep = ""))
[1] "Average ICC for F1 is 0.928. The 95% CI is [0.911 - 0.942]."
print(paste("Average ICC for F2 is ", round(Average_F2$value, digits = 3), ". ", 
            "The 95% CI is [", round(Average_F2$lbound, digits = 3), " - ", round(Average_F2$ubound, digits = 3), "].", sep = ""))
[1] "Average ICC for F2 is 0.964. The 95% CI is [0.956 - 0.971]."
print("Thus, interrater reliability for the extracted F1 and F2 values from the vowel segments was good to excellent.")
[1] "Thus, interrater reliability for the extracted F1 and F2 values from the vowel segments was good to excellent."
## Removing extra data frames from environment

rm(F1_Rel, F2_Rel, Reliability, Single_F1, Single_F2, Average_F1, Average_F2)

Descriptive Statistics

Means and SD


Descriptives <- AcousticData %>%
  dplyr::group_by(Sex, Etiology) %>%
  dplyr::summarize(VSA_mean = mean(VSA_b, na.rm =T), VSA_sd = sd(VSA_b, na.rm = T),
                   Disp_mean = mean(vowel_ED_b, na.rm =T), Disp_sd = sd(vowel_ED_b, na.rm =T),
                   Hull_mean = mean(Hull_b, na.rm =T), Hull_sd = sd(Hull_b, na.rm =T),
                   VSD25_mean = mean(Hull_bVSD_25, na.rm =T), VSD25_sd = sd(Hull_bVSD_25, na.rm =T),
                   VSD50_mean = mean(Hull_bVSD_50, na.rm =T), VSD50_sd = sd(Hull_bVSD_50, na.rm =T),
                   VSD75_mean = mean(Hull_bVSD_75, na.rm =T), VSD75_sd = sd(Hull_bVSD_75, na.rm =T),
                   VAS_mean = mean(VAS, na.rm =T), VAS_sd = sd(VAS, na.rm =T),
                   OT_mean = mean(transAcc, na.rm =T), OT_sd = sd(transAcc, na.rm =T))

DescriptivesbySex <- AcousticData %>%
  dplyr::group_by(Sex) %>%
  dplyr::summarize(VSA_mean = mean(VSA_b, na.rm =T), VSA_sd = sd(VSA_b, na.rm = T),
                   Disp_mean = mean(vowel_ED_b, na.rm =T), Disp_sd = sd(vowel_ED_b, na.rm =T),
                   Hull_mean = mean(Hull_b, na.rm =T), Hull_sd = sd(Hull_b, na.rm =T),
                   VSD25_mean = mean(Hull_bVSD_25, na.rm =T), VSD25_sd = sd(Hull_bVSD_25, na.rm =T),
                   VSD50_mean = mean(Hull_bVSD_50, na.rm =T), VSD50_sd = sd(Hull_bVSD_50, na.rm =T),
                   VSD75_mean = mean(Hull_bVSD_75, na.rm =T), VSD75_sd = sd(Hull_bVSD_75, na.rm =T),
                   VAS_mean = mean(VAS, na.rm =T), VAS_sd = sd(VAS, na.rm =T),
                   OT_mean = mean(transAcc, na.rm =T), OT_sd = sd(transAcc, na.rm =T))

DescriptivesbyEtiology <- AcousticData %>%
  dplyr::group_by(Etiology) %>%
  dplyr::summarize(VSA_mean = mean(VSA_b, na.rm =T), VSA_sd = sd(VSA_b, na.rm = T),
                   Disp_mean = mean(vowel_ED_b, na.rm =T), Disp_sd = sd(vowel_ED_b, na.rm =T),
                   Hull_mean = mean(Hull_b, na.rm =T), Hull_sd = sd(Hull_b, na.rm =T),
                   VSD25_mean = mean(Hull_bVSD_25, na.rm =T), VSD25_sd = sd(Hull_bVSD_25, na.rm =T),
                   VSD50_mean = mean(Hull_bVSD_50, na.rm =T), VSD50_sd = sd(Hull_bVSD_50, na.rm =T),
                   VSD75_mean = mean(Hull_bVSD_75, na.rm =T), VSD75_sd = sd(Hull_bVSD_75, na.rm =T),
                   VAS_mean = mean(VAS, na.rm =T), VAS_sd = sd(VAS, na.rm =T),
                   OT_mean = mean(transAcc, na.rm =T), OT_sd = sd(transAcc, na.rm =T))

Descriptives

DescriptivesbySex

DescriptivesbyEtiology

Correlations among variables


CorrMatrix1 <- AcousticData %>%
  dplyr::select(VSA_b, vowel_ED_b, Hull_b, Hull_bVSD_25, Hull_bVSD_50, Hull_bVSD_75, VAS, transAcc) %>%
  corrr::correlate()

CorrMatrix1

Data Vis

Group Comparisons: Ridgeline Plots


# Vowel Space Area Distribution by Etiology

VSA_plot <- AcousticData %>%
  ggplot() +
  aes(x = VSA_b,
      y = Etiology,
      color = Etiology,
      fill = Etiology) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Area (Bark)") +
  theme_classic()

## Corner Dispersion Distribution by Etiology

disp_plot <- AcousticData %>%
  ggplot() +
  aes(x = vowel_ED_b,
      y = Etiology,
      color = Etiology,
      fill = Etiology) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Corner Dispersion (Bark)") +
  theme_classic()

# Vowel Space Hull Distribution by Etiology

Hull_plot <- AcousticData %>%
  ggplot() +
  aes(x = Hull_b,
      y = Etiology,
      color = Etiology,
      fill = Etiology) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Hull (Bark)") +
  theme_classic()

# Vowel Space Density 25 Distribution by Etiology

vsd_25_plot <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_25,
      y = Etiology,
      color = Etiology,
      fill = Etiology) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Denisty 25 (Bark)") +
  theme_classic()

# Vowel Space Density 50 Distribution by Etiology

vsd_50_plot <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_50,
      y = Etiology,
      color = Etiology,
      fill = Etiology) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Denisty 50 (Bark)") +
  theme_classic()

# Vowel Space Density 75 Distribution by Etiology

vsd_75_plot <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_75,
      y = Etiology,
      color = Etiology,
      fill = Etiology) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  expand_limits(x=0) +
  xlab("Vowel Space Denisty 75 (Bark)") +
  theme_classic()

# Visual Analog Scale Intelligibility Rating Distribution by Etiology

VAS_plot <- AcousticData %>%
  ggplot() +
  aes(x = VAS,
      y = Etiology,
      color = Etiology,
      fill = Etiology) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Visual Analog Scale (VAS)") +
  theme_classic()

# Orthographic Transcription Score Distribution by Etiology

OT_plot <- AcousticData %>%
  ggplot() +
  aes(x = transAcc,
      y = Etiology,
      color = Etiology,
      fill = Etiology) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  coord_cartesian(xlim = c(0, 100)) +
  xlab("Orthographic Transcription Scores") +
  theme_classic()

# Creating Distributions Figure

Distributions <- ggpubr::ggarrange(VSA_plot, disp_plot, Hull_plot, vsd_25_plot, vsd_50_plot, vsd_75_plot, VAS_plot, OT_plot,
                  ncol = 2,
                  nrow = 4)

# Saving Distribution Figure

ggsave("Plots/Distribution.png", plot = last_plot(), width = 10, height = 10, unit = "in")

Scatter Plots

OT ~ VAS Plot

Group Comparisons

VSA


## Specify the Model
VSA_group <- aov(VSA_b ~ Etiology, data = AcousticData)

## Assumption Check

plot(VSA_group, 1)
plot(VSA_group, 2)
car::leveneTest(VSA_group)
VSA_residuals <- residuals(object = VSA_group)
shapiro.test(VSA_residuals)

## Model Results

summary(VSA_group)

## Kruskal-Wallis Test 

kruskal.test(VSA_b ~ Etiology, data = AcousticData)

## Pairwise Comparisons

pairwise.wilcox.test(AcousticData$VSA_b, AcousticData$Etiology, p.adjust.method = "bonferroni")

Corner Dispersion


## Specify the Model
disp_group <- aov(vowel_ED_b ~ Etiology, data = AcousticData)

## Assumption Check

plot(disp_group, 1)
plot(disp_group, 2)
car::leveneTest(disp_group)
disp_residuals <- residuals(object = disp_group)
shapiro.test(disp_residuals)

## Model Results

summary(disp_group)

Hull


## Specify the Model
hull_group <- aov(Hull_b ~ Etiology, data = AcousticData)

## Assumption Check

plot(hull_group, 1)
plot(hull_group, 2)
car::leveneTest(hull_group)
hull_residuals <- residuals(object = hull_group)
shapiro.test(hull_residuals)

## Model Results

summary(hull_group)

VSD 25


## Specify the Model
vsd25_group <- aov(Hull_bVSD_25 ~ Etiology, data = AcousticData)

## Assumption Check

plot(vsd25_group, 1)
plot(vsd25_group, 2)
car::leveneTest(vsd25_group)
vsd25_residuals <- residuals(object = vsd25_group)
shapiro.test(vsd25_residuals)

## Model Summary

summary(vsd25_group)

VSD 50


## Specify the Model
vsd50_group <- aov(Hull_bVSD_50 ~ Etiology, data = AcousticData)

## Assumption Check

plot(vsd50_group, 1)
plot(vsd50_group, 2)
car::leveneTest(vsd50_group)
vsd50_residuals <- residuals(object = vsd50_group)
shapiro.test(vsd50_residuals)

## Model Results

summary(vsd50_group)

## Kruskal Wallis Test

kruskal.test(Hull_bVSD_50 ~ Etiology, data = AcousticData)

VSD 75


## Specify the Model
vsd75_group <- aov(Hull_bVSD_75 ~ Etiology, data = AcousticData)

## Assumption Check

plot(vsd75_group, 1)
plot(vsd75_group, 2)
car::leveneTest(vsd75_group)
vsd75_residuals <- residuals(object = vsd75_group)
shapiro.test(vsd75_residuals)

## Model Summary

summary(vsd75_group)

## Kruskal Wallis

kruskal.test(Hull_bVSD_75 ~ Etiology, data = AcousticData)

VAS


## Specify the Model
VAS_group <- aov(VAS ~ Sex*Etiology, data = AcousticData)

## Assumption Check

plot(VAS_group, 1)
plot(VAS_group, 2)
car::leveneTest(VAS_group)
VAS_residuals <- residuals(object = VAS_group)
shapiro.test(VAS_residuals)

## Model Results

summary(VAS_group)

OT


## Specify the Model
OT_group <- aov(transAcc ~ Sex*Etiology, data = AcousticData)

## Assumption Check

plot(OT_group, 1)
plot(OT_group, 2)
car::leveneTest(OT_group)
OT_residuals <- residuals(object = OT_group)
shapiro.test(OT_residuals)

## Model Results

summary(OT_group)

Modeling Intelligibility

Orthographic Transcriptions

Model 1


# Specifying Model 1

OT_Model1 <- lm(transAcc ~ Hull_bVSD_25, data = AcousticData)

## Model 1 Assumptions 

performance::check_model(OT_Model1)

## Model 1 Summary

summary(OT_Model1)

Model 2


## Specifying Model 2

OT_Model2 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75, data = AcousticData)

## Model 2 Assumption Check

performance::check_model(OT_Model2)

## Model 2 Summary

summary(OT_Model2)

## Model 1 and Model 2 Comparison

anova(OT_Model1, OT_Model2)

Model 3


## Specifying Model 3

OT_Model3 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b, data = AcousticData)

## Model 3 Assumption Check

performance::check_model(OT_Model3)

## Model 3 Summary

summary(OT_Model3)

## Model 2 and Model 3 Comparison

anova(OT_Model2, OT_Model3)

Model 4


## Specifying Model 4

OT_Model4 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b, data = AcousticData)

## Model 4 Assumption Check

performance::check_model(OT_Model4)

## Model 4 Summary

summary(OT_Model4)

## Model 3 and Model 4 Comparison

anova(OT_Model3, OT_Model4)

Model 5


## Specifying Model 5

OT_Model5 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b, data = AcousticData)

## Model 4 Assumption Check

performance::check_model(OT_Model5)

## Model 4 Summary

summary(OT_Model5)

## Model 3 and Model 4 Comparison

anova(OT_Model4, OT_Model5)

Final Model


## Specifying Final Model

OT_Model_final <- lm(transAcc ~ VSA_b, data = AcousticData)

## Final Model Assumption Check

performance::check_model(OT_Model_final)


## Final Model Summary

summary(OT_Model_final)

Call:
lm(formula = transAcc ~ VSA_b, data = AcousticData)

Residuals:
   Min     1Q Median     3Q    Max 
-46.72 -12.69   2.97  14.37  35.39 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   32.508      7.857   4.138 0.000187 ***
VSA_b          5.872      1.613   3.641 0.000807 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 20.86 on 38 degrees of freedom
Multiple R-squared:  0.2586,    Adjusted R-squared:  0.2391 
F-statistic: 13.25 on 1 and 38 DF,  p-value: 0.0008068

VAS Models

Model 1


# Specifying Model 1

VAS_Model1 <- lm(VAS ~ Hull_bVSD_25, data = AcousticData)

## Model 1 Assumptions 

performance::check_model(VAS_Model1)

## Model 1 Summary

summary(VAS_Model1)

Model 2


## Specifying Model 2

VAS_Model2 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75, data = AcousticData)

## Model 2 Assumption Check

performance::check_model(VAS_Model2)

## Model 2 Summary

summary(VAS_Model2)

## Model 1 and Model 2 Comparison

anova(VAS_Model1, VAS_Model2)

Model 3


## Specifying Model 3

VAS_Model3 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b, data = AcousticData)

## Model 3 Assumption Check

performance::check_model(VAS_Model3)

## Model 3 Summary

summary(VAS_Model3)

## Model 2 and Model 3 Comparison

anova(VAS_Model2, VAS_Model3)

Model 4


## Specifying Model 4

VAS_Model4 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b, data = AcousticData)

## Model 4 Assumption Check

performance::check_model(VAS_Model4)

## Model 4 Summary

summary(VAS_Model4)

## Model 3 and Model 4 Comparison

anova(VAS_Model3, VAS_Model4)

Model 5


## Specifying Model 5

VAS_Model5 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b, data = AcousticData)

## Model 5 Assumption Check

performance::check_model(VAS_Model5)

## Model 5 Summary

summary(VAS_Model5)

## Model 4 and Model 5 Comparison

anova(VAS_Model4, VAS_Model5)

Final Model


## Specifying Final Model

VAS_Model_final <- lm(VAS ~ VSA_b, data = AcousticData)

## Final Model Assumption Check

performance::check_model(VAS_Model_final)


## Final Model Summary

summary(VAS_Model_final)

Call:
lm(formula = VAS ~ VSA_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-44.956 -15.943   6.754  17.153  43.062 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept)   24.703      8.761   2.820  0.00760 **
VSA_b          6.163      1.798   3.427  0.00148 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 23.26 on 38 degrees of freedom
Multiple R-squared:  0.2361,    Adjusted R-squared:  0.216 
F-statistic: 11.74 on 1 and 38 DF,  p-value: 0.001482

Relationship between OT and VAS

Tested Model


# Specify Model

OT_VAS_model <- lm(transAcc ~ VAS*Etiology + VAS*Sex, data = AcousticData)

# Assumption Check

performance::check_model(OT_VAS_model)


# Model Results

summary(OT_VAS_model)

Call:
lm(formula = transAcc ~ VAS * Etiology + VAS * Sex, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-14.910  -4.525  -1.280   5.529  16.932 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)        10.8993562  5.7092981   1.909   0.0659 .  
VAS                 0.8924319  0.1276625   6.991  9.1e-08 ***
EtiologyAtaxic      2.9854239  9.5149402   0.314   0.7559    
EtiologyHD          2.1009983  7.3948950   0.284   0.7783    
EtiologyPD         -2.4903757 10.1590855  -0.245   0.8080    
SexM                6.8939642  7.0796700   0.974   0.3380    
VAS:EtiologyAtaxic -0.0019088  0.1791048  -0.011   0.9916    
VAS:EtiologyHD      0.0007804  0.1453318   0.005   0.9958    
VAS:EtiologyPD      0.0320470  0.1732105   0.185   0.8545    
VAS:SexM           -0.1220661  0.1241230  -0.983   0.3333    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 8.488 on 30 degrees of freedom
Multiple R-squared:  0.9031,    Adjusted R-squared:  0.874 
F-statistic: 31.06 on 9 and 30 DF,  p-value: 8.181e-13

Final Model


# Specify Final Model

OT_VAS_final <- lm(transAcc ~ VAS, data = AcousticData)

# Model Results

summary(OT_VAS_final)

Manuscript Tables

Descriptives Table

gtData %>%
  gt::gt(
    rowname_col = "Measure",
    groupname_col = "Sex",
  ) %>%
  fmt_number(
    columns = 'All Etiologies_M':PD_sd,
    decimals = 2
  ) %>%
  tab_spanner(
    label = "All Etiologies",
    columns = c('All Etiologies_M', 'All Etiologies_sd')
  ) %>%
    tab_spanner(
    label = "ALS",
    columns = c(ALS_M, ALS_sd)
  ) %>%
  tab_spanner(
    label = "PD",
    columns = c(PD_M, PD_sd)
  ) %>%
  tab_spanner(
    label = "HD",
    columns = c(HD_M, HD_sd)
  ) %>%
  tab_spanner(
    label = "Ataxic",
    columns = c(Ataxic_M, Ataxic_sd)
  ) %>%
  cols_label(
     'All Etiologies_M' = "M",
     'All Etiologies_sd' = "SD",
     ALS_M = "M",
     ALS_sd = "SD",
     PD_M = "M",
     PD_sd = "SD",
     HD_M = "M",
     HD_sd = "SD",
     Ataxic_M = "M",
     Ataxic_sd = "SD"
  ) %>%
  gtsave("DescriptivesTable.html", path = "/Tables")
Error in normalizePath(dirname(file), mustWork = TRUE) : 
  path[1]="/Tables": No such file or directory
sjPlot::tab_model(OT_Model_final, VAS_Model_final,
                  show.se = T,
                  string.se = "SE",
                  file = "Tables/Model Table.html")

Manuscript Figures

Example Measures

Filtering Process

OT vs. VAS

Model Scatterplot

modelFigureData <- AcousticData %>%
  dplyr::filter(!grepl("_rel",Speaker)) %>%
  dplyr::select(Speaker, Etiology, Sex, VSA_b, vowel_ED_b, Hull_b, Hull_bVSD_25, Hull_bVSD_75, VAS, transAcc) %>%
  dplyr::mutate(Speaker = as.factor(Speaker),
                Etiology = as.factor(Etiology),
                Sex = as.factor(Sex)) %>%
  tidyr::pivot_longer(cols = VAS:transAcc, names_to = "IntType", values_to = "Int") %>%
  dplyr::mutate(IntType = case_when(
    IntType == "transAcc" ~ "OT",
    TRUE ~ "VAS"
    
  ),
                IntType = as.factor(IntType))

ylabel <- "Intelligibility"
myPal <- c("#2D2D37", "#1279B5")
myPalShape <- c(19, 1)

VSA <- modelFigureData %>%
  ggplot() +
  aes(x = VSA_b,
      y = Int,
      color = IntType,
      shape = IntType,
      linetype = IntType) +
  geom_point() +
  geom_smooth(method = "lm", se = T, fill = "light grey") +
  xlab(expression("VSA (Bark"^2*")")) +
  ylab(ylabel) +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"),
        aspect.ratio=1) +
  scale_color_manual(values = myPal) +
  scale_shape_manual(values = myPalShape) +
  labs(color="Intelligibility Type",
       shape = "Intelligibility Type",
       linetype = "Intelligibility Type")

disp <- modelFigureData %>%
  ggplot() +
  aes(x = vowel_ED_b,
      y = Int,
      color = IntType,
      shape = IntType,
      linetype = IntType) +
  geom_point() +
  geom_smooth(method = "lm", se = T, fill = "light grey") +
  xlab("Corner Dispersion (Bark)") +
  ylab(ylabel) +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic() +
  theme(aspect.ratio=1) +
  scale_color_manual(values = myPal) +
  scale_shape_manual(values = myPalShape) +
  labs(color="Intelligibility Type",
       shape = "Intelligibility Type",
       linetype = "Intelligibility Type")

Hull <- modelFigureData %>%
  ggplot() +
  aes(x = Hull_b,
      y = Int,
      color = IntType,
      shape = IntType,
      linetype = IntType) +
  geom_point() +
  geom_smooth(method = "lm", se = T, fill = "light grey") +
  xlab(expression("VSA"[Hull]*" (Bark"^2*")")) +
  ylab(ylabel) +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic() +
  theme(aspect.ratio=1) + theme(legend.position = "none") +
  scale_color_manual(values = myPal) +
  scale_shape_manual(values = myPalShape) +
  labs(color="Intelligibility Type",
       shape = "Intelligibility Type",
       linetype = "Intelligibility Type")

vsd25 <- modelFigureData %>%
  ggplot() +
  aes(x = Hull_bVSD_25,
      y = Int,
      color = IntType,
      shape = IntType,
      linetype = IntType) +
  geom_point() +
  geom_smooth(method = "lm", se = T, fill = "light grey") +
  xlab(expression("VSD"[25]*" (Bark"^2*")")) +
  ylab(ylabel) +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic() +
  theme(aspect.ratio=1) + theme(legend.position = "none") +
  scale_color_manual(values = myPal) +
  scale_shape_manual(values = myPalShape) +
  labs(color="Intelligibility Type",
       shape = "Intelligibility Type",
       linetype = "Intelligibility Type")

vsd75 <- modelFigureData %>%
  ggplot() +
  aes(x = Hull_bVSD_75,
      y = Int,
      color = IntType,
      shape = IntType,
      linetype = IntType) +
  geom_point() +
  geom_smooth(method = "lm", se = T, fill = "light grey") +
  xlab(expression("VSD"[75]*" (Bark"^2*")")) +
  ylab(ylabel) +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic() +
  theme(aspect.ratio=1) + theme(legend.position = "none") +
  scale_color_manual(values = myPal) +
  scale_shape_manual(values = myPalShape) +
  labs(color="Intelligibility Type",
       shape = "Intelligibility Type",
       linetype = "Intelligibility Type")

# Creating OT Scatterplot Figure

scatter <- VSA + disp + patchwork::guide_area() + Hull + vsd25 + vsd75 +
  patchwork::plot_layout(guides = 'collect',
                         ncol = 3)
scatter 

Alternate Analysis

In this alternate analysis, we are looking at the relationship between these acoustic measures with speech intelligibility for the ALS/PD and the HD/Ataxic speakers separately. We create a new variable called Incoord, where the ALS/PD Speakers are set as the reference group (in order to compare to the Ataxic/HD Speaker Group). Group Comparisons, additional data visualizations, and further linear model comparisons are completed.

Data Prep


# Creating a new variable in AcousticData. Incoord is a dummy variable. ALS/PD Speakers = 0, HD/Ataxic = 1

AcousticData <- AcousticData %>%
  dplyr::mutate(Incoord = case_when(Etiology == "HD" ~ 1,
                                    Etiology == "Ataxic" ~ 1,
                                    TRUE ~ 0)) %>%
  dplyr::mutate(Incoord = as.factor(Incoord))

Descriptives


Descriptives_ALS.PD_incoord <- AcousticData %>%
  dplyr::group_by(Incoord) %>%
  dplyr::summarize(VSA_mean = mean(VSA_b, na.rm =T), VSA_sd = sd(VSA_b, na.rm = T),
                   Disp_mean = mean(vowel_ED_b, na.rm =T), Disp_sd = sd(vowel_ED_b, na.rm =T),
                   Hull_mean = mean(Hull_b, na.rm =T), Hull_sd = sd(Hull_b, na.rm =T),
                   VSD25_mean = mean(Hull_bVSD_25, na.rm =T), VSD25_sd = sd(Hull_bVSD_25, na.rm =T),
                   VSD50_mean = mean(Hull_bVSD_50, na.rm =T), VSD50_sd = sd(Hull_bVSD_50, na.rm =T),
                   VSD75_mean = mean(Hull_bVSD_75, na.rm =T), VSD75_sd = sd(Hull_bVSD_75, na.rm =T),
                   VAS_mean = mean(VAS, na.rm =T), VAS_sd = sd(VAS, na.rm =T),
                   OT_mean = mean(transAcc, na.rm =T), OT_sd = sd(transAcc, na.rm =T))

Descriptives_ALS.PD_incoord
NA

Data Vis

Group Comparison Ridgeline Plots


# VSA Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

VSA_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = VSA_b,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Area (Bark)") +
  theme_classic()

# Corner Dispersion Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

disp_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = vowel_ED_b,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Corner Dispersion (Bark)") +
  theme_classic()

# Hull Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

hull_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = Hull_b,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Hull (Bark)") +
  theme_classic()

# VSD 25 Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

vsd25_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_25,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Desnity 25 (Bark)") +
  theme_classic()

# VSD 50 Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

vsd50_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_50,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Desnity 50 (Bark)") +
  theme_classic()

# VSD 75 Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

vsd75_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_75,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Desnity 75 (Bark)") +
  theme_classic()

# Orthographic Transcription Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

OT_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = transAcc,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Percent Words Correct") +
  theme_classic()

# Visual Analog Scale Intelligibility Rating Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

VAS_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = VAS,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Ratigns") +
  theme_classic()

# Creating Distributions by Incoord Figure

Distributions_incoord <- ggpubr::ggarrange(VSA_incoord.plot, disp_incoord.plot, hull_incoord.plot, vsd25_incoord.plot, vsd50_incoord.plot, vsd75_incoord.plot, OT_incoord.plot, VAS_incoord.plot,
                  ncol = 2,
                  nrow = 4)
Picking joint bandwidth of 0.637
Picking joint bandwidth of 0.144
Picking joint bandwidth of 3.74
Picking joint bandwidth of 3.27
Picking joint bandwidth of 1.93
Picking joint bandwidth of 0.764
Picking joint bandwidth of 10.1
Picking joint bandwidth of 13
# Saving Distribution Figure

ggsave("Plots/Distribution_incoord.png", plot = last_plot(), width = 10, height = 10, unit = "in")

Scatterplots

Group Comparisons

Two Dataframes for Incoord Groups


coord.group <- AcousticData %>%
  dplyr::filter(Incoord == 0)

incoord.group <- AcousticData %>%
  dplyr::filter(Incoord == 1)

VSA


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(VSA_b[Incoord == 0]))
with(AcousticData, shapiro.test(VSA_b[Incoord == 1]))

## Equal Variance Check

res.ftest.VSA <- var.test(VSA_b ~ Incoord, data = AcousticData)
res.ftest.VSA

# Model Results

VSA_b_t <- t.test(incoord.group$VSA_b, coord.group$VSA_b, var.equal = T)
VSA_b_t

Corner Dispersion


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(vowel_ED_b[Incoord == 0]))
with(AcousticData, shapiro.test(vowel_ED_b[Incoord == 1]))

## Equal Variance Check

res.ftest.disp <- var.test(vowel_ED_b ~ Incoord, data = AcousticData)
res.ftest.disp

# Model Results

disp_t <- t.test(incoord.group$vowel_ED_b, coord.group$vowel_ED_b, var.equal = T)
disp_t

Hull


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(Hull_b[Incoord == 0]))
with(AcousticData, shapiro.test(Hull_b[Incoord == 1]))

## Equal Variance Check

res.ftest.hull <- var.test(Hull_b ~ Incoord, data = AcousticData)
res.ftest.hull

# Model Results

hull_t <- t.test(incoord.group$Hull_b, coord.group$Hull_b, var.equal = T)
hull_t

VSD 25


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(Hull_bVSD_25[Incoord == 0]))
with(AcousticData, shapiro.test(Hull_bVSD_25[Incoord == 1]))

## Equal Variance Check

res.ftest.vsd25 <- var.test(Hull_bVSD_25 ~ Incoord, data = AcousticData)
res.ftest.vsd25

# Model Results

vsd25_t <- t.test(incoord.group$Hull_bVSD_25, coord.group$Hull_bVSD_25, var.equal = T)
vsd25_t

VSD 50


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(Hull_bVSD_50[Incoord == 0]))
with(AcousticData, shapiro.test(Hull_bVSD_50[Incoord == 1]))

## Equal Variance Check

res.ftest.vsd50 <- var.test(Hull_bVSD_50 ~ Incoord, data = AcousticData)
res.ftest.vsd50

# Model Results (Mann-Whitney U test conducted since assumption of normality is violated)

vsd50_MW <- wilcox.test(Hull_bVSD_50 ~ Incoord, data = AcousticData)
vsd50_MW

VSD 75


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(Hull_bVSD_75[Incoord == 0]))
with(AcousticData, shapiro.test(Hull_bVSD_75[Incoord == 1]))

## Equal Variance Check

res.ftest.vsd75 <- var.test(Hull_bVSD_75 ~ Incoord, data = AcousticData)
res.ftest.vsd75

# Model Results (Mann-Whitney U test conducted since assumption of normality is violated)

vsd75_MW <- wilcox.test(Hull_bVSD_75 ~ Incoord, data = AcousticData)
vsd75_MW

Orthographic Transcription Scores


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(transAcc[Incoord == 0]))
with(AcousticData, shapiro.test(transAcc[Incoord == 1]))

## Equal Variance Check

res.ftest.OT <- var.test(transAcc ~ Incoord, data = AcousticData)
res.ftest.OT

# Model Results (Mann-Whitney U test conducted since assumption of normality is violated)

OT_MW <- wilcox.test(transAcc ~ Incoord, data = AcousticData)
OT_MW

VAS


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(VAS[Incoord == 0]))
with(AcousticData, shapiro.test(VAS[Incoord == 1]))

## Equal Variance Check

res.ftest.VAS <- var.test(VAS ~ Incoord, data = AcousticData)
res.ftest.VAS

# Model Results (Mann-Whitney U test conducted since assumption of normality is violated)

OT_MW <- wilcox.test(VAS ~ Incoord, data = AcousticData)
OT_MW

OT Analysis

Since we found significant group differences for some acoustic measures between the ALS/PD and Ataxic/HD groups, we continued the heirarichal regression approach from OT Model 5. Adding in the Incoord predictor along with the interactions between the acoustic measures did not significantly improve model fit. So our original final OT model is retained.

Model 6


## Specifying Model 6

OT_Model6 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + Incoord, data = AcousticData)

## Model 6 Assumption Check

performance::check_model(OT_Model6)


## Model 6 Summary

summary(OT_Model6)

Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + 
    VSA_b + vowel_ED_b + Incoord, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-42.105 -11.266   4.121  13.717  31.536 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept)   17.5375    21.0257   0.834   0.4102  
Hull_bVSD_25  -1.6809     1.1892  -1.413   0.1669  
Hull_bVSD_75   0.9833     2.1390   0.460   0.6487  
Hull_b         1.0629     0.7946   1.338   0.1901  
VSA_b          6.5678     2.6475   2.481   0.0184 *
vowel_ED_b     4.8102    12.8358   0.375   0.7102  
Incoord1     -12.8123     7.6496  -1.675   0.1034  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 21.02 on 33 degrees of freedom
Multiple R-squared:  0.346, Adjusted R-squared:  0.2271 
F-statistic:  2.91 on 6 and 33 DF,  p-value: 0.02173
## Model 5 and Model 6 Comparison

anova(OT_Model5, OT_Model6)
Error in anova(OT_Model5, OT_Model6) : object 'OT_Model5' not found

Model 7


## Specifying Model 7

OT_Model7 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25, data = AcousticData)

## Model 7 Assumption Check

performance::check_model(OT_Model7)


## Model 7 Summary

summary(OT_Model7)

Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + 
    VSA_b + vowel_ED_b + Incoord + Incoord * Hull_bVSD_25, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-41.665 -10.983   4.212  14.044  31.363 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)            19.3827    22.9018   0.846   0.4036  
Hull_bVSD_25           -1.7865     1.2973  -1.377   0.1780  
Hull_bVSD_75            0.8920     2.2093   0.404   0.6891  
Hull_b                  1.0871     0.8136   1.336   0.1909  
VSA_b                   6.5883     2.6881   2.451   0.0199 *
vowel_ED_b              4.3440    13.1935   0.329   0.7441  
Incoord1              -16.7140    19.2373  -0.869   0.3914  
Hull_bVSD_25:Incoord1   0.2417     1.0905   0.222   0.8260  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 21.33 on 32 degrees of freedom
Multiple R-squared:  0.347, Adjusted R-squared:  0.2042 
F-statistic: 2.429 on 7 and 32 DF,  p-value: 0.04086
## Model 6 and Model 7 Comparison

anova(OT_Model6, OT_Model7)
Analysis of Variance Table

Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     33 14583                           
2     32 14561  1    22.358 0.0491  0.826

Model 8


## Specifying Model 8

OT_Model8 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75, data = AcousticData)

## Model 8 Assumption Check

performance::check_model(OT_Model8)


## Model 8 Summary

summary(OT_Model8)

Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + 
    VSA_b + vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord * 
    Hull_bVSD_75, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-41.858 -12.366   6.261  13.135  30.401 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)            19.4909    22.7677   0.856   0.3985  
Hull_bVSD_25           -1.4002     1.3310  -1.052   0.3009  
Hull_bVSD_75           -0.7590     2.6079  -0.291   0.7730  
Hull_b                  0.9879     0.8132   1.215   0.2336  
VSA_b                   6.8700     2.6831   2.560   0.0155 *
vowel_ED_b              4.0042    13.1193   0.305   0.7622  
Incoord1               -6.3149    21.0758  -0.300   0.7665  
Hull_bVSD_25:Incoord1  -1.1508     1.6068  -0.716   0.4792  
Hull_bVSD_75:Incoord1   5.4156     4.6125   1.174   0.2493  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 21.21 on 31 degrees of freedom
Multiple R-squared:  0.3748,    Adjusted R-squared:  0.2135 
F-statistic: 2.323 on 8 and 31 DF,  p-value: 0.04412
## Model 7 and Model 8 Comparison

anova(OT_Model7, OT_Model8)
Analysis of Variance Table

Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     32 14561                           
2     31 13941  1    619.94 1.3786 0.2493

Model 9


## Specifying Model 9

OT_Model9 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b, data = AcousticData)

## Model 9 Assumption Check

performance::check_model(OT_Model9)


## Model 9 Summary

summary(OT_Model9)

Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + 
    VSA_b + vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord * 
    Hull_bVSD_75 + Incoord * Hull_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-43.387 -11.747   5.389  14.794  30.552 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)            22.2613    23.3541   0.953   0.3481  
Hull_bVSD_25           -0.8239     1.6003  -0.515   0.6104  
Hull_bVSD_75           -1.1104     2.6847  -0.414   0.6821  
Hull_b                  0.5095     1.0933   0.466   0.6446  
VSA_b                   6.9293     2.7092   2.558   0.0158 *
vowel_ED_b              5.4227    13.4118   0.404   0.6888  
Incoord1              -22.3892    32.2682  -0.694   0.4931  
Hull_bVSD_25:Incoord1  -2.4414     2.5348  -0.963   0.3432  
Hull_bVSD_75:Incoord1   6.0684     4.7580   1.275   0.2120  
Hull_b:Incoord1         1.1098     1.6753   0.662   0.5128  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 21.4 on 30 degrees of freedom
Multiple R-squared:  0.3838,    Adjusted R-squared:  0.199 
F-statistic: 2.076 on 9 and 30 DF,  p-value: 0.06468
## Model 8 and Model 9 Comparison

anova(OT_Model8, OT_Model9)
Analysis of Variance Table

Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75 + 
    Incoord * Hull_b
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     31 13941                           
2     30 13740  1    200.96 0.4388 0.5128

Model 10


## Specifying Model 10

OT_Model10 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b + Incoord*VSA_b, data = AcousticData)

## Model 10 Assumption Check

performance::check_model(OT_Model10)

## Model 10 Summary

summary(OT_Model10)

## Model 9 and Model 10 Comparison

anova(OT_Model9, OT_Model10)

Model 11

mo


## Specifying Model 11

OT_Model11 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b + Incoord*VSA_b + Incoord*vowel_ED_b, data = AcousticData)

## Model 11 Assumption Check

performance::check_model(OT_Model11)


## Model 11 Summary

summary(OT_Model11)

Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + 
    VSA_b + vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord * 
    Hull_bVSD_75 + Incoord * Hull_b + Incoord * VSA_b + Incoord * 
    vowel_ED_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-43.580  -9.987   5.535  12.978  34.285 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)            43.2053    29.3160   1.474   0.1517  
Hull_bVSD_25           -1.1058     1.6324  -0.677   0.5037  
Hull_bVSD_75           -1.5475     2.7375  -0.565   0.5764  
Hull_b                  0.7017     1.1505   0.610   0.5469  
VSA_b                  10.1342     4.9387   2.052   0.0496 *
vowel_ED_b            -11.6247    19.6753  -0.591   0.5594  
Incoord1              -65.5861    49.3675  -1.329   0.1947  
Hull_bVSD_25:Incoord1  -2.4987     2.6071  -0.958   0.3460  
Hull_bVSD_75:Incoord1   7.0129     4.8830   1.436   0.1620  
Hull_b:Incoord1         0.9481     1.7139   0.553   0.5845  
VSA_b:Incoord1         -4.9394     5.9410  -0.831   0.4128  
vowel_ED_b:Incoord1    33.2037    27.7349   1.197   0.2413  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 21.6 on 28 degrees of freedom
Multiple R-squared:  0.4141,    Adjusted R-squared:  0.1839 
F-statistic: 1.799 on 11 and 28 DF,  p-value: 0.1025
## Model 10 and Model 11 Comparison

anova(OT_Model10, OT_Model11)
Error in anova(OT_Model10, OT_Model11) : object 'OT_Model10' not found

VAS Analysis

Since we found significant group differences for some acoustic measures between the ALS/PD and Ataxic/HD groups, we continued the hierarchical regression approach from VAS Model 5. VAS Model 6 fit significantly better than VAS Model 5. However, adding in the interactions between Incoord and the acoustic measures did not significantly improve model fit.

Model 6


## Specifying Model 6

VAS_Model6 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + Incoord, data = AcousticData)

## Model 6 Assumption Check

performance::check_model(VAS_Model6)

## Model 6 Summary

summary(VAS_Model6)

## Model 5 and Model 6 Comparison

anova(VAS_Model5, VAS_Model6)

Model 7


## Specifying Model 7

VAS_Model7 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25, data = AcousticData)

## Model 7 Assumption Check

performance::check_model(VAS_Model7)

## Model 7 Summary

summary(VAS_Model7)

## Model 6 and Model 7 Comparison

anova(VAS_Model6, VAS_Model7)

Model 8


## Specifying Model 8

VAS_Model8 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75, data = AcousticData)

## Model 8 Assumption Check

performance::check_model(VAS_Model8)

## Model 8 Summary

summary(VAS_Model8)

## Model 7 and Model 8 Comparison

anova(VAS_Model7, VAS_Model8)

Model 9


## Specifying Model 9

VAS_Model9 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b, data = AcousticData)

## Model 9 Assumption Check

performance::check_model(VAS_Model9)

## Model 9 Summary

summary(VAS_Model9)

## Model 8 and Model 9 Comparison

anova(VAS_Model8, VAS_Model9)

Model 10


## Specifying Model 10

VAS_Model10 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b + Incoord*VSA_b, data = AcousticData)

## Model 10 Assumption Check

performance::check_model(VAS_Model10)

## Model 10 Summary

summary(VAS_Model10)

## Model 9 and Model 10 Comparison

anova(VAS_Model9, VAS_Model10)

Model 11


## Specifying Model 11

VAS_Model11 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b + Incoord*VSA_b + Incoord*vowel_ED_b, data = AcousticData)

## Model 11 Assumption Check

performance::check_model(VAS_Model11)


## Model 11 Summary

summary(VAS_Model11)

Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + 
    vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord * 
    Hull_bVSD_75 + Incoord * Hull_b + Incoord * VSA_b + Incoord * 
    vowel_ED_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-40.891 -10.110   1.062  12.791  41.858 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)            47.5360    31.4458   1.512   0.1418  
Hull_bVSD_25           -2.1672     1.7510  -1.238   0.2261  
Hull_bVSD_75           -0.5799     2.9363  -0.198   0.8449  
Hull_b                  1.0811     1.2341   0.876   0.3885  
VSA_b                  13.3050     5.2975   2.512   0.0181 *
vowel_ED_b            -20.8152    21.1048  -0.986   0.3324  
Incoord1              -97.1376    52.9541  -1.834   0.0772 .
Hull_bVSD_25:Incoord1  -1.2486     2.7965  -0.447   0.6587  
Hull_bVSD_75:Incoord1   5.3787     5.2378   1.027   0.3133  
Hull_b:Incoord1         0.6902     1.8384   0.375   0.7102  
VSA_b:Incoord1         -8.4322     6.3726  -1.323   0.1965  
vowel_ED_b:Incoord1    49.3281    29.7498   1.658   0.1085  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 23.17 on 28 degrees of freedom
Multiple R-squared:  0.4413,    Adjusted R-squared:  0.2218 
F-statistic: 2.011 on 11 and 28 DF,  p-value: 0.06657
## Model 10 and Model 11 Comparison

anova(VAS_Model10, VAS_Model11)
Error in anova(VAS_Model10, VAS_Model11) : object 'VAS_Model10' not found

New Final VAS Model

Since VAS Model 6 was significantly better fit than Model 5, we fit a new final parsimonious model for VAS to the data (VAS ~ VSA_b + Incoord) and compared that to the old final VAS model (VAS ~ VSA_b). The new final model was not a significantly better fit than the old final model. Thus the old final model (VAS ~ VSA_b) is retained.


## Specifying New Final VAS Model

VAS_Model_newfinal <- lm(VAS ~ VSA_b + Incoord, data = AcousticData)

## New Final VAS Model Assumption Check

performance::check_model(VAS_Model_newfinal)


## New Final VAS Model Summary

summary(VAS_Model_newfinal)

Call:
lm(formula = VAS ~ VSA_b + Incoord, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-42.770 -17.018   3.197  18.896  40.044 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   25.305      8.498   2.978 0.005097 ** 
VSA_b          7.680      1.925   3.990 0.000301 ***
Incoord1     -14.624      7.873  -1.858 0.071190 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 22.54 on 37 degrees of freedom
Multiple R-squared:  0.3012,    Adjusted R-squared:  0.2635 
F-statistic: 7.975 on 2 and 37 DF,  p-value: 0.001319
## Comparison to Old Final Model

anova(VAS_Model_final, VAS_Model_newfinal)
Analysis of Variance Table

Model 1: VAS ~ VSA_b
Model 2: VAS ~ VSA_b + Incoord
  Res.Df   RSS Df Sum of Sq      F  Pr(>F)  
1     38 20556                              
2     37 18802  1    1753.6 3.4509 0.07119 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Testing Individual Predictors

Because some correlations between predictors are high. We run a series of simple linear regressions to test if the predictors significantly predict each intelligibility measure on their own (VSD 25 and VSA models were already complete in our initial model comparison approach)

Orthographic Transcription Models


# OT ~ VSD 75

OT_vsd75_model <- lm(transAcc ~ Hull_bVSD_75, data = AcousticData)
performance::check_model(OT_vsd75_model)
summary(OT_vsd75_model)

# OT ~ Hull

OT_hull_model <- lm(transAcc ~ Hull_b, data = AcousticData)
performance::check_model(OT_hull_model)
summary(OT_hull_model)

# OT ~ Corner Dispersion

OT_disp_model <- lm(transAcc ~ vowel_ED_b, data = AcousticData)
performance::check_model(OT_disp_model)
summary(OT_disp_model)

VAS Models


# VAS ~ VSD 75

VAS_vsd75_model <- lm(VAS ~ Hull_bVSD_75, data = AcousticData)
performance::check_model(VAS_vsd75_model)
summary(VAS_vsd75_model)

# VAS ~ Hull

VAS_hull_model <- lm(VAS ~ Hull_b, data = AcousticData)
performance::check_model(VAS_hull_model)
summary(VAS_hull_model)

# VAS ~ Corner Dispersion

VAS_disp_model <- lm(VAS ~ vowel_ED_b, data = AcousticData)
performance::check_model(VAS_disp_model)
summary(VAS_disp_model)

Listener Demographic Information


ListenerDemo <- Listeners %>%
  furniture::table1(age, gender, race, ethnicity)

ListenerDemo

Speaker Demographics


SpeakerDemo <- AcousticData %>%
  dplyr::select(c(Speaker, Sex, Etiology))

Ages <- rio::import("Prepped Data/Speaker Ages.xlsx")

SpeakerDemo <- full_join(SpeakerDemo, Ages, by = "Speaker")

SpeakerDemoInfo <- SpeakerDemo %>%
  furniture::table1(Sex, Etiology, Age, na.rm = F)
SpeakerDemoInfo

─────────────────────────────
─────────────────────────────
SpeakerDemo %>%
  dplyr::summarize(mean_age = mean(Age, na.rm = T), age_sd = sd(Age, na.rm = T), age_range = range(Age, na.rm = T))
NA
LS0tCnRpdGxlOiAiVm93ZWwgQWNvdXN0aWNzIGFzIFByZWRpY3RvcnMgb2YgU3BlZWNoIEludGVsbGlnaWJpbGl0eSBpbiBEeXNhcnRocmlhIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpUaGlzIGlzIHRoZSBjb2RlIGZvciB0aGUgc3RhdGlzdGljYWwgYW5hbHlzaXMgZm9yICJWb3dlbCBBY291c3RpY3MgYXMgUHJlZGljdG9ycyBvZiBTcGVlY2ggSW50ZWxsaWdpYmlsaXR5IGluIER5c2FydGhyaWEuIgoKIyBMb2FkaW5nIFBhY2thZ2VzCgpgYGB7cn0KCmxpYnJhcnkocmlvKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShpcnIpCmxpYnJhcnkocGVyZm9ybWFuY2UpCmxpYnJhcnkoY2FyKQpsaWJyYXJ5KGdncHVicikKbGlicmFyeShjb3JycikKbGlicmFyeShnZ3JpZGdlcykKbGlicmFyeShmdXJuaXR1cmUpCmxpYnJhcnkoZ3QpCmxpYnJhcnkocGF0Y2h3b3JrKQpsaWJyYXJ5KGtzKQojIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJBbGxhbkNhbWVyb24vZ2VvbXRleHRwYXRoIikKbGlicmFyeShnZW9tdGV4dHBhdGgpCgpgYGAKCiMgVXBsb2FkIERhdGFzZXRzCgpgYGB7cn0KClJlbGlhYmlsaXR5IDwtIHJpbzo6aW1wb3J0KCJQcmVwcGVkIERhdGEvUmVsaWFiaWxpdHkgRGF0YS5jc3YiKQpBY291c3RpY0RhdGEgPC0gcmlvOjppbXBvcnQoIlByZXBwZWQgRGF0YS9BY291c3RpY01lYXN1cmVzLmNzdiIpICU+JQogIGRwbHlyOjptdXRhdGUoaW50RGlmZiA9IFZBUyAtIHRyYW5zQWNjKQoKQWNvdXN0aWNEYXRhIDwtIEFjb3VzdGljRGF0YSAlPiUKICBkcGx5cjo6ZmlsdGVyKCFncmVwbCgiX3JlbCIsIFNwZWFrZXIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGMoU3BlYWtlciwgU2V4LCBFdGlvbG9neSwgdm93ZWxfRURfYiwgVlNBX2IsIEh1bGxfYiwgSHVsbF9iVlNEXzI1LCBIdWxsX2JWU0RfNTAsIEh1bGxfYlZTRF83NSwgVkFTLCB0cmFuc0FjYykpCgpMaXN0ZW5lcnMgPC0gcmlvOjppbXBvcnQoIlByZXBwZWQgRGF0YS9MaXN0ZW5lcl9EZW1vZ3JhcGhpY3MuY3N2IikgJT4lCiAgZHBseXI6OnNlbGVjdCghYyhTdGFydERhdGU6cHJvbG9maWNJRCwgUTIuNF82X1RFWFQsIFEzLjJfOF9URVhULCBBdWRpb0NoZWNrOkVQMykpCgpMaXN0ZW5lcnMkcmFjZVtMaXN0ZW5lcnMkUTMuM183X1RFWFQgPT0gIk5hdGl2ZSBBbWVyaWNhbi8gQWZyaWNhbiBhbWVyY2luZyJdIDwtICJCaXJhY2lhbCBvciBNdWx0aXJhY2lhbCIKYGBgCgoKIyBJbnRlci1yYXRlciBSZWxpYWJpbGl0eQoKVHdvIHJhdGVycyAodGhlIGZpcnN0IHR3byBhdXRob3JzKSBjb21wbGV0ZWQgdm93ZWwgc2VnbWVudGF0aW9uIGZvciB0aGUgc3BlYWtlcnMuIFRvIGNhbGN1bGF0ZSBpbnRlci1yYXRlciByZWxpYWJpbGl0eSwgMjAlIG9mIHRoZSBzcGVha2VycyB3ZXJlIHNlZ21lbnRlZCBhZ2FpbiBieSB0aGUgb3RoZXIgcmF0ZXIuIFR3by13YXkgaW50cmFjbGFzcyBjb2VmZmljaWVudHMgd2VyZSBjb21wdXRlZCBmb3IgdGhlIGV4dHJhY3RlZCBGMSBhbmQgRjIgZnJvbSB0aGUgdGVtcG9yYWwgbWlkcG9pbnQgb2YgdGhlIHZvd2VsIHNlZ21lbnRzLiBTaW5jZSBvbmx5IG9uZSBzZXQgb2YgcmF0aW5ncyB3aWxsIGJlIHVzZWQgaW4gdGhlIGRhdGEgYW5hbHlzaXMsIHdlIGZvY3VzIG9uIHRoZSBzaW5nbGUgSUNDIHJlc3VsdHMgYW5kIGludGVycHJldGF0aW9uLiBIb3dldmVyLCB3ZSBhbHNvIHJlcG9ydCB0aGUgYXZlcmFnZSBJQ0MgdmFsdWVzIHRvIGJlIGNvbXByZWhlbnNpdmUuCgpgYGB7cn0KCiMjIENyZWF0aW5nIG5ldyBkYXRhIGZyYW1lcyB0byBjYWxjdWxhdGUgSUNDIGZvciBleHRyYWN0ZWQgRjEgYW5kIEYyIHZhbHVlcwoKRjFfUmVsIDwtIFJlbGlhYmlsaXR5ICU+JQogIGRwbHlyOjpzZWxlY3QoYyhGMSwgRjFfcmVsKSkKCkYyX1JlbCA8LSBSZWxpYWJpbGl0eSAlPiUKICBkcGx5cjo6c2VsZWN0KGMoRjIsIEYyX3JlbCkpCiAgCiMjIFNpbmdsZSBJQ0MgZm9yIEYxClNpbmdsZV9GMSA8LSBpcnI6OmljYyhGMV9SZWwsIG1vZGVsID0gInR3b3dheSIsIHR5cGUgPSAiYWdyZWVtZW50IiwgdW5pdCA9ICJzaW5nbGUiKQoKIyMgQXZlcmFnZSBJQ0MgZm9yIEYxCkF2ZXJhZ2VfRjEgPC0gaXJyOjppY2MoRjFfUmVsLCBtb2RlbCA9ICJ0d293YXkiLCB0eXBlID0gImFncmVlbWVudCIsIHVuaXQgPSAiYXZlcmFnZSIpCgojIyBTaW5nbGUgSUNDIGZvciBGMgpTaW5nbGVfRjIgPC0gaXJyOjppY2MoRjJfUmVsLCBtb2RlbCA9ICJ0d293YXkiLCB0eXBlID0gImFncmVlbWVudCIsIHVuaXQgPSAic2luZ2xlIikKCiMjIEF2ZXJhZ2UgSUNDIGZvciBGMgpBdmVyYWdlX0YyIDwtIGlycjo6aWNjKEYyX1JlbCwgbW9kZWwgPSAidHdvd2F5IiwgdHlwZSA9ICJhZ3JlZW1lbnQiLCB1bml0ID0gImF2ZXJhZ2UiKQoKIyMgSW50ZXItcmF0ZXIgcmVsaWFiaWxpdHkgcmVzdWx0cyBhbmQgaW50ZXJwcmV0YXRpb24KCnByaW50KHBhc3RlKCJTaW5nbGUgSUNDIGZvciBGMSBpcyAiLCByb3VuZChTaW5nbGVfRjEkdmFsdWUsIGRpZ2l0cyA9IDMpLCAiLiAiLCAKICAgICAgICAgICAgIlRoZSA5NSUgQ0kgaXMgWyIsIHJvdW5kKFNpbmdsZV9GMSRsYm91bmQsIGRpZ2l0cyA9IDMpLCAiIC0gIiwgcm91bmQoU2luZ2xlX0YxJHVib3VuZCwgZGlnaXRzID0gMyksICJdLiIsIHNlcCA9ICIiKSkKCnByaW50KHBhc3RlKCJTaW5nbGUgSUNDIGZvciBGMiBpcyAiLCByb3VuZChTaW5nbGVfRjIkdmFsdWUsIGRpZ2l0cyA9IDMpLCAiLiAiLCAKICAgICAgICAgICAgIlRoZSA5NSUgQ0kgaXMgWyIsIHJvdW5kKFNpbmdsZV9GMiRsYm91bmQsIGRpZ2l0cyA9IDMpLCAiIC0gIiwgcm91bmQoU2luZ2xlX0YyJHVib3VuZCwgZGlnaXRzID0gMyksICJdLiIsIHNlcCA9ICIiKSkKCnByaW50KHBhc3RlKCJBdmVyYWdlIElDQyBmb3IgRjEgaXMgIiwgcm91bmQoQXZlcmFnZV9GMSR2YWx1ZSwgZGlnaXRzID0gMyksICIuICIsIAogICAgICAgICAgICAiVGhlIDk1JSBDSSBpcyBbIiwgcm91bmQoQXZlcmFnZV9GMSRsYm91bmQsIGRpZ2l0cyA9IDMpLCAiIC0gIiwgcm91bmQoQXZlcmFnZV9GMSR1Ym91bmQsIGRpZ2l0cyA9IDMpLCAiXS4iLCBzZXAgPSAiIikpCgpwcmludChwYXN0ZSgiQXZlcmFnZSBJQ0MgZm9yIEYyIGlzICIsIHJvdW5kKEF2ZXJhZ2VfRjIkdmFsdWUsIGRpZ2l0cyA9IDMpLCAiLiAiLCAKICAgICAgICAgICAgIlRoZSA5NSUgQ0kgaXMgWyIsIHJvdW5kKEF2ZXJhZ2VfRjIkbGJvdW5kLCBkaWdpdHMgPSAzKSwgIiAtICIsIHJvdW5kKEF2ZXJhZ2VfRjIkdWJvdW5kLCBkaWdpdHMgPSAzKSwgIl0uIiwgc2VwID0gIiIpKQoKcHJpbnQoIlRodXMsIGludGVycmF0ZXIgcmVsaWFiaWxpdHkgZm9yIHRoZSBleHRyYWN0ZWQgRjEgYW5kIEYyIHZhbHVlcyBmcm9tIHRoZSB2b3dlbCBzZWdtZW50cyB3YXMgZ29vZCB0byBleGNlbGxlbnQuIikKCiMjIFJlbW92aW5nIGV4dHJhIGRhdGEgZnJhbWVzIGZyb20gZW52aXJvbm1lbnQKCnJtKEYxX1JlbCwgRjJfUmVsLCBSZWxpYWJpbGl0eSwgU2luZ2xlX0YxLCBTaW5nbGVfRjIsIEF2ZXJhZ2VfRjEsIEF2ZXJhZ2VfRjIpCgpgYGAKCgojIERlc2NyaXB0aXZlIFN0YXRpc3RpY3MKCiMjIE1lYW5zIGFuZCBTRAoKYGBge3J9CgpEZXNjcmlwdGl2ZXMgPC0gQWNvdXN0aWNEYXRhICU+JQogIGRwbHlyOjpncm91cF9ieShTZXgsIEV0aW9sb2d5KSAlPiUKICBkcGx5cjo6c3VtbWFyaXplKFZTQV9tZWFuID0gbWVhbihWU0FfYiwgbmEucm0gPVQpLCBWU0Ffc2QgPSBzZChWU0FfYiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgIERpc3BfbWVhbiA9IG1lYW4odm93ZWxfRURfYiwgbmEucm0gPVQpLCBEaXNwX3NkID0gc2Qodm93ZWxfRURfYiwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgSHVsbF9tZWFuID0gbWVhbihIdWxsX2IsIG5hLnJtID1UKSwgSHVsbF9zZCA9IHNkKEh1bGxfYiwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVlNEMjVfbWVhbiA9IG1lYW4oSHVsbF9iVlNEXzI1LCBuYS5ybSA9VCksIFZTRDI1X3NkID0gc2QoSHVsbF9iVlNEXzI1LCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWU0Q1MF9tZWFuID0gbWVhbihIdWxsX2JWU0RfNTAsIG5hLnJtID1UKSwgVlNENTBfc2QgPSBzZChIdWxsX2JWU0RfNTAsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZTRDc1X21lYW4gPSBtZWFuKEh1bGxfYlZTRF83NSwgbmEucm0gPVQpLCBWU0Q3NV9zZCA9IHNkKEh1bGxfYlZTRF83NSwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVkFTX21lYW4gPSBtZWFuKFZBUywgbmEucm0gPVQpLCBWQVNfc2QgPSBzZChWQVMsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIE9UX21lYW4gPSBtZWFuKHRyYW5zQWNjLCBuYS5ybSA9VCksIE9UX3NkID0gc2QodHJhbnNBY2MsIG5hLnJtID1UKSkKCkRlc2NyaXB0aXZlc2J5U2V4IDwtIEFjb3VzdGljRGF0YSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoU2V4KSAlPiUKICBkcGx5cjo6c3VtbWFyaXplKFZTQV9tZWFuID0gbWVhbihWU0FfYiwgbmEucm0gPVQpLCBWU0Ffc2QgPSBzZChWU0FfYiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgIERpc3BfbWVhbiA9IG1lYW4odm93ZWxfRURfYiwgbmEucm0gPVQpLCBEaXNwX3NkID0gc2Qodm93ZWxfRURfYiwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgSHVsbF9tZWFuID0gbWVhbihIdWxsX2IsIG5hLnJtID1UKSwgSHVsbF9zZCA9IHNkKEh1bGxfYiwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVlNEMjVfbWVhbiA9IG1lYW4oSHVsbF9iVlNEXzI1LCBuYS5ybSA9VCksIFZTRDI1X3NkID0gc2QoSHVsbF9iVlNEXzI1LCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWU0Q1MF9tZWFuID0gbWVhbihIdWxsX2JWU0RfNTAsIG5hLnJtID1UKSwgVlNENTBfc2QgPSBzZChIdWxsX2JWU0RfNTAsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZTRDc1X21lYW4gPSBtZWFuKEh1bGxfYlZTRF83NSwgbmEucm0gPVQpLCBWU0Q3NV9zZCA9IHNkKEh1bGxfYlZTRF83NSwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVkFTX21lYW4gPSBtZWFuKFZBUywgbmEucm0gPVQpLCBWQVNfc2QgPSBzZChWQVMsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIE9UX21lYW4gPSBtZWFuKHRyYW5zQWNjLCBuYS5ybSA9VCksIE9UX3NkID0gc2QodHJhbnNBY2MsIG5hLnJtID1UKSkKCkRlc2NyaXB0aXZlc2J5RXRpb2xvZ3kgPC0gQWNvdXN0aWNEYXRhICU+JQogIGRwbHlyOjpncm91cF9ieShFdGlvbG9neSkgJT4lCiAgZHBseXI6OnN1bW1hcml6ZShWU0FfbWVhbiA9IG1lYW4oVlNBX2IsIG5hLnJtID1UKSwgVlNBX3NkID0gc2QoVlNBX2IsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgICBEaXNwX21lYW4gPSBtZWFuKHZvd2VsX0VEX2IsIG5hLnJtID1UKSwgRGlzcF9zZCA9IHNkKHZvd2VsX0VEX2IsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIEh1bGxfbWVhbiA9IG1lYW4oSHVsbF9iLCBuYS5ybSA9VCksIEh1bGxfc2QgPSBzZChIdWxsX2IsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZTRDI1X21lYW4gPSBtZWFuKEh1bGxfYlZTRF8yNSwgbmEucm0gPVQpLCBWU0QyNV9zZCA9IHNkKEh1bGxfYlZTRF8yNSwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVlNENTBfbWVhbiA9IG1lYW4oSHVsbF9iVlNEXzUwLCBuYS5ybSA9VCksIFZTRDUwX3NkID0gc2QoSHVsbF9iVlNEXzUwLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWU0Q3NV9tZWFuID0gbWVhbihIdWxsX2JWU0RfNzUsIG5hLnJtID1UKSwgVlNENzVfc2QgPSBzZChIdWxsX2JWU0RfNzUsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZBU19tZWFuID0gbWVhbihWQVMsIG5hLnJtID1UKSwgVkFTX3NkID0gc2QoVkFTLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBPVF9tZWFuID0gbWVhbih0cmFuc0FjYywgbmEucm0gPVQpLCBPVF9zZCA9IHNkKHRyYW5zQWNjLCBuYS5ybSA9VCkpCgpEZXNjcmlwdGl2ZXMKCkRlc2NyaXB0aXZlc2J5U2V4CgpEZXNjcmlwdGl2ZXNieUV0aW9sb2d5CgpgYGAKCiMjIENvcnJlbGF0aW9ucyBhbW9uZyB2YXJpYWJsZXMKCmBgYHtyfQoKQ29yck1hdHJpeDEgPC0gQWNvdXN0aWNEYXRhICU+JQogIGRwbHlyOjpzZWxlY3QoVlNBX2IsIHZvd2VsX0VEX2IsIEh1bGxfYiwgSHVsbF9iVlNEXzI1LCBIdWxsX2JWU0RfNTAsIEh1bGxfYlZTRF83NSwgVkFTLCB0cmFuc0FjYykgJT4lCiAgY29ycnI6OmNvcnJlbGF0ZSgpCgpDb3JyTWF0cml4MQoKYGBgCgoKIyMgRGF0YSBWaXMKCiMjIyBHcm91cCBDb21wYXJpc29uczogUmlkZ2VsaW5lIFBsb3RzCgpgYGB7cn0KCiMgVm93ZWwgU3BhY2UgQXJlYSBEaXN0cmlidXRpb24gYnkgRXRpb2xvZ3kKClZTQV9wbG90IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBWU0FfYiwKICAgICAgeSA9IEV0aW9sb2d5LAogICAgICBjb2xvciA9IEV0aW9sb2d5LAogICAgICBmaWxsID0gRXRpb2xvZ3kpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGppdHRlcmVkX3BvaW50cyA9IFQsIAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKHdpZHRoID0gMC4wMSwgaGVpZ2h0ID0gMCksIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2hhcGUgPSAnfCcsIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDUsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNywKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gLjcpICsKICB4bGFiKCJWb3dlbCBTcGFjZSBBcmVhIChCYXJrKSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMjIENvcm5lciBEaXNwZXJzaW9uIERpc3RyaWJ1dGlvbiBieSBFdGlvbG9neQoKZGlzcF9wbG90IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB2b3dlbF9FRF9iLAogICAgICB5ID0gRXRpb2xvZ3ksCiAgICAgIGNvbG9yID0gRXRpb2xvZ3ksCiAgICAgIGZpbGwgPSBFdGlvbG9neSkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIkNvcm5lciBEaXNwZXJzaW9uIChCYXJrKSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgVm93ZWwgU3BhY2UgSHVsbCBEaXN0cmlidXRpb24gYnkgRXRpb2xvZ3kKCkh1bGxfcGxvdCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iLAogICAgICB5ID0gRXRpb2xvZ3ksCiAgICAgIGNvbG9yID0gRXRpb2xvZ3ksCiAgICAgIGZpbGwgPSBFdGlvbG9neSkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIlZvd2VsIFNwYWNlIEh1bGwgKEJhcmspIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyBWb3dlbCBTcGFjZSBEZW5zaXR5IDI1IERpc3RyaWJ1dGlvbiBieSBFdGlvbG9neQoKdnNkXzI1X3Bsb3QgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IEh1bGxfYlZTRF8yNSwKICAgICAgeSA9IEV0aW9sb2d5LAogICAgICBjb2xvciA9IEV0aW9sb2d5LAogICAgICBmaWxsID0gRXRpb2xvZ3kpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGppdHRlcmVkX3BvaW50cyA9IFQsIAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKHdpZHRoID0gMC4wMSwgaGVpZ2h0ID0gMCksIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2hhcGUgPSAnfCcsIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDUsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNywKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gLjcpICsKICB4bGFiKCJWb3dlbCBTcGFjZSBEZW5pc3R5IDI1IChCYXJrKSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgVm93ZWwgU3BhY2UgRGVuc2l0eSA1MCBEaXN0cmlidXRpb24gYnkgRXRpb2xvZ3kKCnZzZF81MF9wbG90IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfNTAsCiAgICAgIHkgPSBFdGlvbG9neSwKICAgICAgY29sb3IgPSBFdGlvbG9neSwKICAgICAgZmlsbCA9IEV0aW9sb2d5KSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhqaXR0ZXJlZF9wb2ludHMgPSBULCAKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcih3aWR0aCA9IDAuMDEsIGhlaWdodCA9IDApLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NoYXBlID0gJ3wnLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSA1LAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAxLAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjcsCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IC43KSArCiAgeGxhYigiVm93ZWwgU3BhY2UgRGVuaXN0eSA1MCAoQmFyaykiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIFZvd2VsIFNwYWNlIERlbnNpdHkgNzUgRGlzdHJpYnV0aW9uIGJ5IEV0aW9sb2d5Cgp2c2RfNzVfcGxvdCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iVlNEXzc1LAogICAgICB5ID0gRXRpb2xvZ3ksCiAgICAgIGNvbG9yID0gRXRpb2xvZ3ksCiAgICAgIGZpbGwgPSBFdGlvbG9neSkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIGV4cGFuZF9saW1pdHMoeD0wKSArCiAgeGxhYigiVm93ZWwgU3BhY2UgRGVuaXN0eSA3NSAoQmFyaykiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIFZpc3VhbCBBbmFsb2cgU2NhbGUgSW50ZWxsaWdpYmlsaXR5IFJhdGluZyBEaXN0cmlidXRpb24gYnkgRXRpb2xvZ3kKClZBU19wbG90IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBWQVMsCiAgICAgIHkgPSBFdGlvbG9neSwKICAgICAgY29sb3IgPSBFdGlvbG9neSwKICAgICAgZmlsbCA9IEV0aW9sb2d5KSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhqaXR0ZXJlZF9wb2ludHMgPSBULCAKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcih3aWR0aCA9IDAuMDEsIGhlaWdodCA9IDApLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NoYXBlID0gJ3wnLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSA1LAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAxLAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjcsCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IC43KSArCiAgeGxhYigiVmlzdWFsIEFuYWxvZyBTY2FsZSAoVkFTKSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgT3J0aG9ncmFwaGljIFRyYW5zY3JpcHRpb24gU2NvcmUgRGlzdHJpYnV0aW9uIGJ5IEV0aW9sb2d5CgpPVF9wbG90IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB0cmFuc0FjYywKICAgICAgeSA9IEV0aW9sb2d5LAogICAgICBjb2xvciA9IEV0aW9sb2d5LAogICAgICBmaWxsID0gRXRpb2xvZ3kpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGppdHRlcmVkX3BvaW50cyA9IFQsIAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKHdpZHRoID0gMC4wMSwgaGVpZ2h0ID0gMCksIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2hhcGUgPSAnfCcsIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDUsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNywKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gLjcpICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgMTAwKSkgKwogIHhsYWIoIk9ydGhvZ3JhcGhpYyBUcmFuc2NyaXB0aW9uIFNjb3JlcyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgQ3JlYXRpbmcgRGlzdHJpYnV0aW9ucyBGaWd1cmUKCkRpc3RyaWJ1dGlvbnMgPC0gZ2dwdWJyOjpnZ2FycmFuZ2UoVlNBX3Bsb3QsIGRpc3BfcGxvdCwgSHVsbF9wbG90LCB2c2RfMjVfcGxvdCwgdnNkXzUwX3Bsb3QsIHZzZF83NV9wbG90LCBWQVNfcGxvdCwgT1RfcGxvdCwKICAgICAgICAgICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICAgICAgICAgIG5yb3cgPSA0KQoKIyBTYXZpbmcgRGlzdHJpYnV0aW9uIEZpZ3VyZQoKZ2dzYXZlKCJQbG90cy9EaXN0cmlidXRpb24ucG5nIiwgcGxvdCA9IGxhc3RfcGxvdCgpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMCwgdW5pdCA9ICJpbiIpCgoKYGBgCgojIyMgU2NhdHRlciBQbG90cwoKYGBge3J9CgojIE9UIFNjYXR0ZXJwbG90cwoKT1RfVlNBIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBWU0FfYiwKICAgICAgeSA9IHRyYW5zQWNjKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFQsIGNvbG9yID0gIiNFNjlGMDAiLCBmaWxsID0gImxpZ2h0IGdyZXkiKSArCiAgeGxhYihleHByZXNzaW9uKCJWb3dlbCBTcGFjZSBBcmVhIChCYXJrIl4yKiIpIikpICsKICB5bGFiKCJQZXJjZW50IFdvcmRzIENvcnJlY3QiKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgYXNwZWN0LnJhdGlvPTEpCgpPVF9kaXNwIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB2b3dlbF9FRF9iLAogICAgICB5ID0gdHJhbnNBY2MpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVCwgY29sb3IgPSAiIzU2QjRFOSIsIGZpbGwgPSAibGlnaHQgZ3JleSIpICsKICB4bGFiKCJDb3JuZXIgRGlzcGVyc2lvbiAoQmFyaykiKSArCiAgeWxhYigiUGVyY2VudCBXb3JkcyBDb3JyZWN0IikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEwMCkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGFzcGVjdC5yYXRpbz0xKQoKT1RfSHVsbCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iLAogICAgICB5ID0gdHJhbnNBY2MpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVCwgY29sb3IgPSAiIzAwOUU3MyIsIGZpbGwgPSAibGlnaHQgZ3JleSIpICsKICB4bGFiKGV4cHJlc3Npb24oIlZvd2VsIFNwYWNlIEh1bGwgKEJhcmsiXjIqIikiKSkgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkKCk9UX3ZzZDI1IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfMjUsCiAgICAgIHkgPSB0cmFuc0FjYykgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBULCBjb2xvciA9ICIjMDA3MkIyIiwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVm93ZWwgU3BhY2UgRGVuc2l0eSJbMjVdKiIgKEJhcmsiXjIqIikiKSkgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkKCk9UX3ZzZDc1IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfNzUsCiAgICAgIHkgPSB0cmFuc0FjYykgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBULCBjb2xvciA9ICIjRDU1RTAwIiwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVm93ZWwgU3BhY2UgRGVuc2l0eSJbNzVdKiIgKEJhcmsiXjIqIikiKSkgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkKCiMgQ3JlYXRpbmcgT1QgU2NhdHRlcnBsb3QgRmlndXJlCgpPVF9TY2F0dGVycGxvdHMgPC0gZ2dwdWJyOjpnZ2FycmFuZ2UoT1RfVlNBLCBPVF9kaXNwLCBOVUxMLCBPVF9IdWxsLCBPVF92c2QyNSwgT1RfdnNkNzUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMywgbnJvdyA9IDIpCgojIyBTYXZpbmcgT1QgU2NhdHRlcnBsb3QgRmlndXJlCmRpci5jcmVhdGUoIlBsb3RzIiwgc2hvd1dhcm5pbmdzID0gRikKZ2dzYXZlKCJQbG90cy9PVF9TY2F0dGVycGxvdHMucG5nIiwgcGxvdCA9IGxhc3RfcGxvdCgpLCB3aWR0aCA9IDE1LCBoZWlnaHQgPSAxNSwgdW5pdCA9ICJpbiIsIHNjYWxlID0gMC42KQoKIyBWQVMgU2NhdHRlcnBsb3RzCgpWQVNfVlNBIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBWU0FfYiwKICAgICAgeSA9IFZBUykgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBULCBjb2xvciA9ICIjRTY5RjAwIiwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVm93ZWwgU3BhY2UgQXJlYSAoQmFyayJeMioiKSIpKSArCiAgeWxhYigiVkFTIFJhdGluZyIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gImJvbGQiKSkKClZBU19kaXNwIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB2b3dlbF9FRF9iLAogICAgICB5ID0gVkFTKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFQsIGNvbG9yID0gIiM1NkI0RTkiLCBmaWxsID0gImxpZ2h0IGdyZXkiKSArCiAgeGxhYigiQ29ybmVyIERpc3BlcnNpb24gKEJhcmspIikgKwogIHlsYWIoIlZBUyBSYXRpbmciKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKQoKVkFTX0h1bGwgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IEh1bGxfYiwKICAgICAgeSA9IFZBUykgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBULCBjb2xvciA9ICIjMDA5RTczIiwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVm93ZWwgU3BhY2UgSHVsbCAoQmFyayJeMioiKSIpKSArCiAgeWxhYigiVkFTIFJhdGluZyIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgpWQVNfdnNkMjUgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IEh1bGxfYlZTRF8yNSwKICAgICAgeSA9IFZBUykgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBULCBjb2xvciA9ICIjMDA3MkIyIiwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVm93ZWwgU3BhY2UgRGVuc2l0eSJbMjVdKiIgKEJhcmsiXjIqIikiKSkgKwogIHlsYWIoIlZBUyBSYXRpbmciKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKQoKVkFTX3ZzZDc1IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfNzUsCiAgICAgIHkgPSBWQVMpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVCwgY29sb3IgPSAiI0Q1NUUwMCIsIGZpbGwgPSAibGlnaHQgZ3JleSIpICsKICB4bGFiKGV4cHJlc3Npb24oIlZvd2VsIFNwYWNlIERlbnNpdHkiWzc1XSoiIChCYXJrIl4yKiIpIikpICsKICB5bGFiKCJWQVMgUmF0aW5nIikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEwMCkpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgQ3JlYXRpbmcgVkFTIFNjYXR0ZXJwbG90IEZpZ3VyZQoKVkFTX1NjYXR0ZXJwbG90cyA8LSBnZ3B1YnI6OmdnYXJyYW5nZShWQVNfVlNBLCBWQVNfZGlzcCwgVkFTX0h1bGwsIFZBU192c2QyNSwgVkFTX3ZzZDc1LAogICAgICAgICAgICAgICAgICBuY29sID0gMywgbnJvdyA9IDIpCgojIyBTYXZpbmcgVkFTIFNjYXR0ZXJwbG90IEZpZ3VyZQoKZ2dzYXZlKCJQbG90cy9WQVNfU2NhdHRlcnBsb3RzLnBuZyIsIHBsb3QgPSBsYXN0X3Bsb3QoKSwgd2lkdGggPSAxNSwgaGVpZ2h0ID0gMTUsIHVuaXQgPSAiaW4iLCBzY2FsZSA9IC42KQoKYGBgCgoKIyMjIE9UIH4gVkFTIFBsb3QKCmBgYHtyfQoKIyBWQVMgfiBPVCBQbG90CgpWQVNfT1QgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IFZBUywKICAgICAgeSA9IHRyYW5zQWNjKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFQsIGNvbG9yID0gIiNDQzc5QTciLCBmaWxsID0gImxpZ2h0IGdyZXkiKSArIAogIGdndGl0bGUoIlJlbGF0aW9uc2hpcCBCZXR3ZWVuIEludGVsbGlnaWJpbGl0eSBNZWFzdXJlcyIpICsKICB4bGFiKCJWQVMgUmF0aW5nIikgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIpKQoKIyBTYXZpbmcgT1QgfiBWQVMgUGxvdAoKZ2dzYXZlKCJQbG90cy9PVHZhcy5wbmciLCBwbG90ID0gbGFzdF9wbG90KCksIHdpZHRoID0gOCwgaGVpZ2h0ID0gOCwgdW5pdCA9ICJpbiIsIHNjYWxlID0gMC42KQogIAojIE9UIH4gVkFTIGJ5IFNleAoKVkFTX09UX1NleCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gVkFTLAogICAgICB5ID0gdHJhbnNBY2MsCiAgICAgIGNvbG9yID0gU2V4KSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEYpICsKICB4bGFiKCJWQVMgUmF0aW5nIikgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdnc2F2ZSgiUGxvdHMvT1R2YXNfc2V4LnBuZyIsIHBsb3QgPSBsYXN0X3Bsb3QoKSwgd2lkdGggPSA1LCBoZWlnaHQgPSA1LCB1bml0ID0gImluIiwgc2NhbGUgPSAwLjYpCgojIE9UIH4gVkFTIGJ5IEV0aW9sb2d5CgpWQVNfT1RfRXRpb2xvZ3kgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IFZBUywKICAgICAgeSA9IHRyYW5zQWNjLAogICAgICBjb2xvciA9IEV0aW9sb2d5KSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEYpICsKICB4bGFiKCJWQVMgUmF0aW5nIikgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdnc2F2ZSgiUGxvdHMvT1R2YXNfZXRpb2xvZ3kucG5nIiwgcGxvdCA9IGxhc3RfcGxvdCgpLCB3aWR0aCA9IDUsIGhlaWdodCA9IDUsIHVuaXQgPSAiaW4iLCBzY2FsZSA9IDAuNikKCmBgYAoKCiMgR3JvdXAgQ29tcGFyaXNvbnMKCiMjIFZTQQoKYGBge3J9CgojIyBTcGVjaWZ5IHRoZSBNb2RlbApWU0FfZ3JvdXAgPC0gYW92KFZTQV9iIH4gRXRpb2xvZ3ksIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBBc3N1bXB0aW9uIENoZWNrCgpwbG90KFZTQV9ncm91cCwgMSkKcGxvdChWU0FfZ3JvdXAsIDIpCmNhcjo6bGV2ZW5lVGVzdChWU0FfZ3JvdXApClZTQV9yZXNpZHVhbHMgPC0gcmVzaWR1YWxzKG9iamVjdCA9IFZTQV9ncm91cCkKc2hhcGlyby50ZXN0KFZTQV9yZXNpZHVhbHMpCgojIyBNb2RlbCBSZXN1bHRzCgpzdW1tYXJ5KFZTQV9ncm91cCkKCiMjIEtydXNrYWwtV2FsbGlzIFRlc3QgCgprcnVza2FsLnRlc3QoVlNBX2IgfiBFdGlvbG9neSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIFBhaXJ3aXNlIENvbXBhcmlzb25zCgpwYWlyd2lzZS53aWxjb3gudGVzdChBY291c3RpY0RhdGEkVlNBX2IsIEFjb3VzdGljRGF0YSRFdGlvbG9neSwgcC5hZGp1c3QubWV0aG9kID0gImJvbmZlcnJvbmkiKQoKYGBgCgojIyBDb3JuZXIgRGlzcGVyc2lvbgoKYGBge3J9CgojIyBTcGVjaWZ5IHRoZSBNb2RlbApkaXNwX2dyb3VwIDwtIGFvdih2b3dlbF9FRF9iIH4gRXRpb2xvZ3ksIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBBc3N1bXB0aW9uIENoZWNrCgpwbG90KGRpc3BfZ3JvdXAsIDEpCnBsb3QoZGlzcF9ncm91cCwgMikKY2FyOjpsZXZlbmVUZXN0KGRpc3BfZ3JvdXApCmRpc3BfcmVzaWR1YWxzIDwtIHJlc2lkdWFscyhvYmplY3QgPSBkaXNwX2dyb3VwKQpzaGFwaXJvLnRlc3QoZGlzcF9yZXNpZHVhbHMpCgojIyBNb2RlbCBSZXN1bHRzCgpzdW1tYXJ5KGRpc3BfZ3JvdXApCgpgYGAKCiMjIEh1bGwKCmBgYHtyfQoKIyMgU3BlY2lmeSB0aGUgTW9kZWwKaHVsbF9ncm91cCA8LSBhb3YoSHVsbF9iIH4gRXRpb2xvZ3ksIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBBc3N1bXB0aW9uIENoZWNrCgpwbG90KGh1bGxfZ3JvdXAsIDEpCnBsb3QoaHVsbF9ncm91cCwgMikKY2FyOjpsZXZlbmVUZXN0KGh1bGxfZ3JvdXApCmh1bGxfcmVzaWR1YWxzIDwtIHJlc2lkdWFscyhvYmplY3QgPSBodWxsX2dyb3VwKQpzaGFwaXJvLnRlc3QoaHVsbF9yZXNpZHVhbHMpCgojIyBNb2RlbCBSZXN1bHRzCgpzdW1tYXJ5KGh1bGxfZ3JvdXApCgpgYGAKCiMjIFZTRCAyNQoKYGBge3J9CgojIyBTcGVjaWZ5IHRoZSBNb2RlbAp2c2QyNV9ncm91cCA8LSBhb3YoSHVsbF9iVlNEXzI1IH4gRXRpb2xvZ3ksIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBBc3N1bXB0aW9uIENoZWNrCgpwbG90KHZzZDI1X2dyb3VwLCAxKQpwbG90KHZzZDI1X2dyb3VwLCAyKQpjYXI6OmxldmVuZVRlc3QodnNkMjVfZ3JvdXApCnZzZDI1X3Jlc2lkdWFscyA8LSByZXNpZHVhbHMob2JqZWN0ID0gdnNkMjVfZ3JvdXApCnNoYXBpcm8udGVzdCh2c2QyNV9yZXNpZHVhbHMpCgojIyBNb2RlbCBTdW1tYXJ5CgpzdW1tYXJ5KHZzZDI1X2dyb3VwKQoKCmBgYAoKCiMjIFZTRCA1MAoKYGBge3J9CgojIyBTcGVjaWZ5IHRoZSBNb2RlbAp2c2Q1MF9ncm91cCA8LSBhb3YoSHVsbF9iVlNEXzUwIH4gRXRpb2xvZ3ksIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBBc3N1bXB0aW9uIENoZWNrCgpwbG90KHZzZDUwX2dyb3VwLCAxKQpwbG90KHZzZDUwX2dyb3VwLCAyKQpjYXI6OmxldmVuZVRlc3QodnNkNTBfZ3JvdXApCnZzZDUwX3Jlc2lkdWFscyA8LSByZXNpZHVhbHMob2JqZWN0ID0gdnNkNTBfZ3JvdXApCnNoYXBpcm8udGVzdCh2c2Q1MF9yZXNpZHVhbHMpCgojIyBNb2RlbCBSZXN1bHRzCgpzdW1tYXJ5KHZzZDUwX2dyb3VwKQoKIyMgS3J1c2thbCBXYWxsaXMgVGVzdAoKa3J1c2thbC50ZXN0KEh1bGxfYlZTRF81MCB+IEV0aW9sb2d5LCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKYGBgCgojIyBWU0QgNzUKCmBgYHtyfQoKIyMgU3BlY2lmeSB0aGUgTW9kZWwKdnNkNzVfZ3JvdXAgPC0gYW92KEh1bGxfYlZTRF83NSB+IEV0aW9sb2d5LCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgQXNzdW1wdGlvbiBDaGVjawoKcGxvdCh2c2Q3NV9ncm91cCwgMSkKcGxvdCh2c2Q3NV9ncm91cCwgMikKY2FyOjpsZXZlbmVUZXN0KHZzZDc1X2dyb3VwKQp2c2Q3NV9yZXNpZHVhbHMgPC0gcmVzaWR1YWxzKG9iamVjdCA9IHZzZDc1X2dyb3VwKQpzaGFwaXJvLnRlc3QodnNkNzVfcmVzaWR1YWxzKQoKIyMgTW9kZWwgU3VtbWFyeQoKc3VtbWFyeSh2c2Q3NV9ncm91cCkKCiMjIEtydXNrYWwgV2FsbGlzCgprcnVza2FsLnRlc3QoSHVsbF9iVlNEXzc1IH4gRXRpb2xvZ3ksIGRhdGEgPSBBY291c3RpY0RhdGEpCgpgYGAKCiMjIFZBUyAKCmBgYHtyfQoKIyMgU3BlY2lmeSB0aGUgTW9kZWwKVkFTX2dyb3VwIDwtIGFvdihWQVMgfiBTZXgqRXRpb2xvZ3ksIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBBc3N1bXB0aW9uIENoZWNrCgpwbG90KFZBU19ncm91cCwgMSkKcGxvdChWQVNfZ3JvdXAsIDIpCmNhcjo6bGV2ZW5lVGVzdChWQVNfZ3JvdXApClZBU19yZXNpZHVhbHMgPC0gcmVzaWR1YWxzKG9iamVjdCA9IFZBU19ncm91cCkKc2hhcGlyby50ZXN0KFZBU19yZXNpZHVhbHMpCgojIyBNb2RlbCBSZXN1bHRzCgpzdW1tYXJ5KFZBU19ncm91cCkKCmBgYAoKIyMgT1QKCmBgYHtyfQoKIyMgU3BlY2lmeSB0aGUgTW9kZWwKT1RfZ3JvdXAgPC0gYW92KHRyYW5zQWNjIH4gU2V4KkV0aW9sb2d5LCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgQXNzdW1wdGlvbiBDaGVjawoKcGxvdChPVF9ncm91cCwgMSkKcGxvdChPVF9ncm91cCwgMikKY2FyOjpsZXZlbmVUZXN0KE9UX2dyb3VwKQpPVF9yZXNpZHVhbHMgPC0gcmVzaWR1YWxzKG9iamVjdCA9IE9UX2dyb3VwKQpzaGFwaXJvLnRlc3QoT1RfcmVzaWR1YWxzKQoKIyMgTW9kZWwgUmVzdWx0cwoKc3VtbWFyeShPVF9ncm91cCkKCmBgYAoKIyBNb2RlbGluZyBJbnRlbGxpZ2liaWxpdHkKCiMjIE9ydGhvZ3JhcGhpYyBUcmFuc2NyaXB0aW9ucwoKIyMjIE1vZGVsIDEKCmBgYHtyfQoKIyBTcGVjaWZ5aW5nIE1vZGVsIDEKCk9UX01vZGVsMSA8LSBsbSh0cmFuc0FjYyB+IEh1bGxfYlZTRF8yNSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDEgQXNzdW1wdGlvbnMgCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoT1RfTW9kZWwxKQoKIyMgTW9kZWwgMSBTdW1tYXJ5CgpzdW1tYXJ5KE9UX01vZGVsMSkKCmBgYAoKIyMjIE1vZGVsIDIKCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCAyCgpPVF9Nb2RlbDIgPC0gbG0odHJhbnNBY2MgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCAyIEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChPVF9Nb2RlbDIpCgojIyBNb2RlbCAyIFN1bW1hcnkKCnN1bW1hcnkoT1RfTW9kZWwyKQoKIyMgTW9kZWwgMSBhbmQgTW9kZWwgMiBDb21wYXJpc29uCgphbm92YShPVF9Nb2RlbDEsIE9UX01vZGVsMikKCmBgYAoKIyMjIE1vZGVsIDMKCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCAzCgpPVF9Nb2RlbDMgPC0gbG0odHJhbnNBY2MgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUgKyBIdWxsX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCAzIEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChPVF9Nb2RlbDMpCgojIyBNb2RlbCAzIFN1bW1hcnkKCnN1bW1hcnkoT1RfTW9kZWwzKQoKIyMgTW9kZWwgMiBhbmQgTW9kZWwgMyBDb21wYXJpc29uCgphbm92YShPVF9Nb2RlbDIsIE9UX01vZGVsMykKCmBgYAoKIyMjIE1vZGVsIDQKCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCA0CgpPVF9Nb2RlbDQgPC0gbG0odHJhbnNBY2MgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUgKyBIdWxsX2IgKyBWU0FfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDQgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsNCkKCiMjIE1vZGVsIDQgU3VtbWFyeQoKc3VtbWFyeShPVF9Nb2RlbDQpCgojIyBNb2RlbCAzIGFuZCBNb2RlbCA0IENvbXBhcmlzb24KCmFub3ZhKE9UX01vZGVsMywgT1RfTW9kZWw0KQoKYGBgCiMjIyBNb2RlbCA1CgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgNQoKT1RfTW9kZWw1IDwtIGxtKHRyYW5zQWNjIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgNCBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoT1RfTW9kZWw1KQoKIyMgTW9kZWwgNCBTdW1tYXJ5CgpzdW1tYXJ5KE9UX01vZGVsNSkKCiMjIE1vZGVsIDMgYW5kIE1vZGVsIDQgQ29tcGFyaXNvbgoKYW5vdmEoT1RfTW9kZWw0LCBPVF9Nb2RlbDUpCgpgYGAKCgojIyMgRmluYWwgTW9kZWwKCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBGaW5hbCBNb2RlbAoKT1RfTW9kZWxfZmluYWwgPC0gbG0odHJhbnNBY2MgfiBWU0FfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIEZpbmFsIE1vZGVsIEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChPVF9Nb2RlbF9maW5hbCkKCiMjIEZpbmFsIE1vZGVsIFN1bW1hcnkKCnN1bW1hcnkoT1RfTW9kZWxfZmluYWwpCgpgYGAKCgojIyBWQVMgTW9kZWxzCgojIyMgTW9kZWwgMQoKYGBge3J9CgojIFNwZWNpZnlpbmcgTW9kZWwgMQoKVkFTX01vZGVsMSA8LSBsbShWQVMgfiBIdWxsX2JWU0RfMjUsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCAxIEFzc3VtcHRpb25zIAoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU19Nb2RlbDEpCgojIyBNb2RlbCAxIFN1bW1hcnkKCnN1bW1hcnkoVkFTX01vZGVsMSkKCmBgYAoKIyMjIE1vZGVsIDIKCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCAyCgpWQVNfTW9kZWwyIDwtIGxtKFZBUyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDIgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU19Nb2RlbDIpCgojIyBNb2RlbCAyIFN1bW1hcnkKCnN1bW1hcnkoVkFTX01vZGVsMikKCiMjIE1vZGVsIDEgYW5kIE1vZGVsIDIgQ29tcGFyaXNvbgoKYW5vdmEoVkFTX01vZGVsMSwgVkFTX01vZGVsMikKCmBgYAoKIyMjIE1vZGVsIDMKCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCAzCgpWQVNfTW9kZWwzIDwtIGxtKFZBUyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDMgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU19Nb2RlbDMpCgojIyBNb2RlbCAzIFN1bW1hcnkKCnN1bW1hcnkoVkFTX01vZGVsMykKCiMjIE1vZGVsIDIgYW5kIE1vZGVsIDMgQ29tcGFyaXNvbgoKYW5vdmEoVkFTX01vZGVsMiwgVkFTX01vZGVsMykKCmBgYAoKIyMjIE1vZGVsIDQKCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCA0CgpWQVNfTW9kZWw0IDwtIGxtKFZBUyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiArIFZTQV9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgNCBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoVkFTX01vZGVsNCkKCiMjIE1vZGVsIDQgU3VtbWFyeQoKc3VtbWFyeShWQVNfTW9kZWw0KQoKIyMgTW9kZWwgMyBhbmQgTW9kZWwgNCBDb21wYXJpc29uCgphbm92YShWQVNfTW9kZWwzLCBWQVNfTW9kZWw0KQoKYGBgCgojIyMgTW9kZWwgNQoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDUKClZBU19Nb2RlbDUgPC0gbG0oVkFTIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgNSBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoVkFTX01vZGVsNSkKCiMjIE1vZGVsIDUgU3VtbWFyeQoKc3VtbWFyeShWQVNfTW9kZWw1KQoKIyMgTW9kZWwgNCBhbmQgTW9kZWwgNSBDb21wYXJpc29uCgphbm92YShWQVNfTW9kZWw0LCBWQVNfTW9kZWw1KQoKYGBgCgoKIyMjIEZpbmFsIE1vZGVsCgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgRmluYWwgTW9kZWwKClZBU19Nb2RlbF9maW5hbCA8LSBsbShWQVMgfiBWU0FfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIEZpbmFsIE1vZGVsIEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfTW9kZWxfZmluYWwpCgojIyBGaW5hbCBNb2RlbCBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbF9maW5hbCkKCmBgYAojIyBSZWxhdGlvbnNoaXAgYmV0d2VlbiBPVCBhbmQgVkFTCgojIyMgVGVzdGVkIE1vZGVsCgpgYGB7cn0KCiMgU3BlY2lmeSBNb2RlbAoKT1RfVkFTX21vZGVsIDwtIGxtKHRyYW5zQWNjIH4gVkFTKkV0aW9sb2d5ICsgVkFTKlNleCwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX1ZBU19tb2RlbCkKCiMgTW9kZWwgUmVzdWx0cwoKc3VtbWFyeShPVF9WQVNfbW9kZWwpCgpgYGAKCiMjIEZpbmFsIE1vZGVsCgpgYGB7cn0KCiMgU3BlY2lmeSBGaW5hbCBNb2RlbAoKT1RfVkFTX2ZpbmFsIDwtIGxtKHRyYW5zQWNjIH4gVkFTLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyBNb2RlbCBSZXN1bHRzCgpzdW1tYXJ5KE9UX1ZBU19maW5hbCkKCmBgYAoKIyBNYW51c2NyaXB0IFRhYmxlcwpEZXNjcmlwdGl2ZXMgVGFibGUKYGBge3J9Cmd0RGF0YSA8LSBBY291c3RpY0RhdGEgJT4lCiAgcmJpbmQoLixBY291c3RpY0RhdGEgJT4lCiAgICAgICAgICBkcGx5cjo6bXV0YXRlKEV0aW9sb2d5ID0gIkFsbCBFdGlvbG9naWVzIikpICU+JQogIHJiaW5kKC4sQWNvdXN0aWNEYXRhICU+JQogICAgICAgICAgcmJpbmQoLixBY291c3RpY0RhdGEgJT4lCiAgICAgICAgICBkcGx5cjo6bXV0YXRlKEV0aW9sb2d5ID0gIkFsbCBFdGlvbG9naWVzIikpICU+JQogICAgICAgICAgZHBseXI6Om11dGF0ZShTZXggPSAiQWxsIikpICU+JQogIGRwbHlyOjptdXRhdGUoU2V4ID0gYXMuZmFjdG9yKFNleCksCiAgICAgICAgICAgICAgICBFdGlvbG9neSA9IGFzLmZhY3RvcihFdGlvbG9neSkpICU+JQogIGRwbHlyOjpncm91cF9ieShTZXgsIEV0aW9sb2d5KSAlPiUKICBkcGx5cjo6c3VtbWFyaXplKFZTQV9tZWFuID0gbWVhbihWU0FfYiwgbmEucm0gPVQpLCBWU0Ffc2QgPSBzZChWU0FfYiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgIERpc3BfbWVhbiA9IG1lYW4odm93ZWxfRURfYiwgbmEucm0gPVQpLCBEaXNwX3NkID0gc2Qodm93ZWxfRURfYiwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgSHVsbF9tZWFuID0gbWVhbihIdWxsX2IsIG5hLnJtID1UKSwgSHVsbF9zZCA9IHNkKEh1bGxfYiwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVlNEMjVfbWVhbiA9IG1lYW4oSHVsbF9iVlNEXzI1LCBuYS5ybSA9VCksIFZTRDI1X3NkID0gc2QoSHVsbF9iVlNEXzI1LCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWU0Q1MF9tZWFuID0gbWVhbihIdWxsX2JWU0RfNTAsIG5hLnJtID1UKSwgVlNENTBfc2QgPSBzZChIdWxsX2JWU0RfNTAsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZTRDc1X21lYW4gPSBtZWFuKEh1bGxfYlZTRF83NSwgbmEucm0gPVQpLCBWU0Q3NV9zZCA9IHNkKEh1bGxfYlZTRF83NSwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVkFTX21lYW4gPSBtZWFuKFZBUywgbmEucm0gPVQpLCBWQVNfc2QgPSBzZChWQVMsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIE9UX21lYW4gPSBtZWFuKHRyYW5zQWNjLCBuYS5ybSA9VCksIE9UX3NkID0gc2QodHJhbnNBY2MsIG5hLnJtID1UKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBWU0FfbWVhbjpPVF9zZCwgbmFtZXNfdG8gPSAiTWVhc3VyZSIsCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJWYWx1ZSIpICU+JQogIGRwbHlyOjptdXRhdGUobWVhblNEID0gaWZlbHNlKGdyZXBsKCJfbWVhbiIsTWVhc3VyZSksIk0iLCJzZCIpLAogICAgICAgICAgICAgICAgTWVhc3VyZSA9IGdzdWIoIl9tZWFuIiwiIixNZWFzdXJlKSwKICAgICAgICAgICAgICAgIE1lYXN1cmUgPSBnc3ViKCJfc2QiLCIiLE1lYXN1cmUpLAogICAgICAgICAgICAgICAgRXRpb2xvZ3kgPSBwYXN0ZShFdGlvbG9neSxtZWFuU0QsIHNlcCA9ICJfIiksCiAgICAgICAgICAgICAgICBTZXggPSBjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgIFNleCA9PSAiQWxsIiB+ICJBbGwgU3BlYWtlcnMiLAogICAgICAgICAgICAgICAgICBTZXggPT0gIk0iIH4gIk1hbGUiLAogICAgICAgICAgICAgICAgICBTZXggPT0gIkYiIH4gIkZlbWFsZSIKICAgICAgICAgICAgICAgICkpICU+JQogIGRwbHlyOjpzZWxlY3QoIW1lYW5TRCkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IEV0aW9sb2d5LCB2YWx1ZXNfZnJvbSA9ICJWYWx1ZSIpICU+JQogIGRwbHlyOjpmaWx0ZXIoTWVhc3VyZSAhPSAiVlNENTAiKQoKZ3REYXRhICU+JQogIGd0OjpndCgKICAgIHJvd25hbWVfY29sID0gIk1lYXN1cmUiLAogICAgZ3JvdXBuYW1lX2NvbCA9ICJTZXgiLAogICkgJT4lCiAgZm10X251bWJlcigKICAgIGNvbHVtbnMgPSAnQWxsIEV0aW9sb2dpZXNfTSc6UERfc2QsCiAgICBkZWNpbWFscyA9IDIKICApICU+JQogIHRhYl9zcGFubmVyKAogICAgbGFiZWwgPSAiQWxsIEV0aW9sb2dpZXMiLAogICAgY29sdW1ucyA9IGMoJ0FsbCBFdGlvbG9naWVzX00nLCAnQWxsIEV0aW9sb2dpZXNfc2QnKQogICkgJT4lCiAgICB0YWJfc3Bhbm5lcigKICAgIGxhYmVsID0gIkFMUyIsCiAgICBjb2x1bW5zID0gYyhBTFNfTSwgQUxTX3NkKQogICkgJT4lCiAgdGFiX3NwYW5uZXIoCiAgICBsYWJlbCA9ICJQRCIsCiAgICBjb2x1bW5zID0gYyhQRF9NLCBQRF9zZCkKICApICU+JQogIHRhYl9zcGFubmVyKAogICAgbGFiZWwgPSAiSEQiLAogICAgY29sdW1ucyA9IGMoSERfTSwgSERfc2QpCiAgKSAlPiUKICB0YWJfc3Bhbm5lcigKICAgIGxhYmVsID0gIkF0YXhpYyIsCiAgICBjb2x1bW5zID0gYyhBdGF4aWNfTSwgQXRheGljX3NkKQogICkgJT4lCiAgY29sc19sYWJlbCgKICAgICAnQWxsIEV0aW9sb2dpZXNfTScgPSAiTSIsCiAgICAgJ0FsbCBFdGlvbG9naWVzX3NkJyA9ICJTRCIsCiAgICAgQUxTX00gPSAiTSIsCiAgICAgQUxTX3NkID0gIlNEIiwKICAgICBQRF9NID0gIk0iLAogICAgIFBEX3NkID0gIlNEIiwKICAgICBIRF9NID0gIk0iLAogICAgIEhEX3NkID0gIlNEIiwKICAgICBBdGF4aWNfTSA9ICJNIiwKICAgICBBdGF4aWNfc2QgPSAiU0QiCiAgKSAlPiUKICBndHNhdmUoIkRlc2NyaXB0aXZlc1RhYmxlLmh0bWwiLCBwYXRoID0gIlRhYmxlcyIpCgpgYGAKYGBge3J9CnNqUGxvdDo6dGFiX21vZGVsKE9UX01vZGVsX2ZpbmFsLCBWQVNfTW9kZWxfZmluYWwsCiAgICAgICAgICAgICAgICAgIHNob3cuc2UgPSBULAogICAgICAgICAgICAgICAgICBzdHJpbmcuc2UgPSAiU0UiLAogICAgICAgICAgICAgICAgICBmaWxlID0gIlRhYmxlcy9Nb2RlbCBUYWJsZS5odG1sIikKYGBgCgoKIyBNYW51c2NyaXB0IEZpZ3VyZXMKIyMgRXhhbXBsZSBNZWFzdXJlcwpgYGB7cn0KZm9ybWFudENvbG9yIDwtICJncmV5Igpmb3JtYW50QWxwaGEgPC0gLjk1CmxpbmVDb2xvciA8LSAid2hpdGUiCmxpbmVBbHBoYSA8LSAuOAoKdm93ZWxEYXRhIDwtIHJpbzo6aW1wb3J0KCJQcmVwcGVkIERhdGEvVm93ZWwgRGF0YS5jc3YiKSAlPiUKICBkcGx5cjo6ZmlsdGVyKFNwZWFrZXIgPT0gIkFGOCIpCgogIFBpdGNoX1BSQUFUIDwtIGxpc3QuZmlsZXMocGF0aCA9IHBhc3RlKCJQcmVwcGVkIERhdGEvRXhhbXBsZSBEYXRhLyIsIHNlcCA9ICIiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiLlBpdGNoIiwgaWdub3JlLmNhc2UgPSBUKSAlPiUKICAgIHBhc3RlKCJQcmVwcGVkIERhdGEvRXhhbXBsZSBEYXRhLyIsLiwgc2VwID0gIiIpICU+JQogICAgcmVhZC5kZWxpbSguLCBoZWFkZXIgPSBGKSAlPiUKICAgIGRwbHlyOjpyZW5hbWUoUGl0Y2ggPSBWMSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKFBpdGNoID0gZ3N1YigiLS11bmRlZmluZWQtLSIsTkEsUGl0Y2gpLAogICAgICAgICAgICAgICAgICBQaXRjaCA9IGFzLm51bWVyaWMoUGl0Y2gpKQogIAogIEZvcm1hbnRzX1BSQUFUIDwtIGxpc3QuZmlsZXMocGF0aCA9IHBhc3RlKCJQcmVwcGVkIERhdGEvRXhhbXBsZSBEYXRhLyIsIHNlcCA9ICIiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiX0Zvcm1hbnQiLCBpZ25vcmUuY2FzZSA9IFQpICU+JQogICAgcGFzdGUoIlByZXBwZWQgRGF0YS9FeGFtcGxlIERhdGEvIiwuLCBzZXAgPSAiIikgJT4lCiAgICByZWFkLmRlbGltKC4sIGhlYWRlciA9IFQpICU+JQogICAgZHBseXI6OnNlbGVjdCghYyhuZm9ybWFudHMsIEIxLkh6LiwgQjIuSHouLCBCMy5Iei4sIEY0Lkh6LiwgQjQuSHouLCBGNS5Iei4sIEI1Lkh6LikpICU+JQogICAgZHBseXI6OnJlbmFtZShUaW1lX3MgPSB0aW1lLnMuLAogICAgICAgICAgICAgICAgICBGMV9IeiA9IEYxLkh6LiwKICAgICAgICAgICAgICAgICAgRjJfSHogPSBGMi5Iei4sCiAgICAgICAgICAgICAgICAgIEYzX0h6ID0gRjMuSHouKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoRjFfSHogPSBpZmVsc2UoRjFfSHogPT0gMCwgTkEsIEYxX0h6KSwKICAgICAgICAgICAgICAgICAgRjJfSHogPSBpZmVsc2UoRjJfSHogPT0gMCwgTkEsIEYyX0h6KSwKICAgICAgICAgICAgICAgICAgRjNfSHogPSBpZmVsc2UoRjNfSHogPT0gMCwgTkEsIEYzX0h6KSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKEYxX0h6ID0gYXMubnVtZXJpYyhGMV9IeiksCiAgICAgICAgICAgICAgICAgIEYyX0h6ID0gYXMubnVtZXJpYyhGMl9IeiksCiAgICAgICAgICAgICAgICAgIEYzX0h6ID0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKEYzX0h6KSksCiAgICAgICAgICAgICAgICAgIFRpbWVfbXMgPSBUaW1lX3MgLyAxMDAwLAogICAgICAgICAgICAgICAgICBGMV9rSHogPSBGMV9IeiAvIDEwMDAsCiAgICAgICAgICAgICAgICAgIEYyX2tIeiA9IEYyX0h6IC8gMTAwMCwKICAgICAgICAgICAgICAgICAgRjNfa0h6ID0gRjNfSHogLyAxMDAwKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoIVRpbWVfcykgJT4lCiAgICBkcGx5cjo6cmVsb2NhdGUoVGltZV9tcywgLmJlZm9yZSA9IEYxX0h6KSAlPiUKICAgIGNiaW5kKC4sUGl0Y2hfUFJBQVQpCiAgCiAgYyA8LSAyCiAgd2hpbGUoYyA8IE5ST1coRm9ybWFudHNfUFJBQVQpKXsKICAgIEZvcm1hbnRzX1BSQUFUJEYxX0h6W2NdIDwtIGlmZWxzZShpcy5uYShGb3JtYW50c19QUkFBVCRGMV9IeltjLTFdKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMubmEoRm9ybWFudHNfUFJBQVQkRjFfSHpbYysxXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWFudHNfUFJBQVQkRjFfSHpbY10pCiAgICBGb3JtYW50c19QUkFBVCRGMl9IeltjXSA8LSBpZmVsc2UoaXMubmEoRm9ybWFudHNfUFJBQVQkRjJfSHpbYy0xXSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKEZvcm1hbnRzX1BSQUFUJEYyX0h6W2MrMV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hbnRzX1BSQUFUJEYyX0h6W2NdKQogICAgYyA8LSBjICsgMQogIH0KICBybShjKQogIAogIEZvcm1hbnRzX1BSQUFUIDwtIEZvcm1hbnRzX1BSQUFUICU+JQogICAgZHBseXI6OmZpbHRlcighaXMubmEoUGl0Y2gpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoRjFfbWFkID0gKGFicyhGMV9IeiAtIG1lZGlhbihGMV9IeikpLyBtYWQoRjFfSHosIGNvbnN0YW50ID0gMS40ODI2KSkgPiAyLjUsCiAgICAgICAgICAgICAgICAgIEYyX21hZCA9IChhYnMoRjJfSHogLSBtZWRpYW4oRjJfSHopKS8gbWFkKEYyX0h6LCBjb25zdGFudCA9IDEuNDgyNikpID4gMi41KSAlPiUKICAgIGRwbHlyOjpmaWx0ZXIoRjFfbWFkID09IEZBTFNFICYgRjJfbWFkID09IEZBTFNFKSAlPiUKICAgIGRwbHlyOjptdXRhdGUobURpc3QgPSBtYWhhbGFub2JpcyhjYmluZCguJEYxX0h6LCAuJEYyX0h6KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xNZWFucyhjYmluZCguJEYxX0h6LCAuJEYyX0h6KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY292ID0gY292KGNiaW5kKC4kRjFfSHosIC4kRjJfSHopKSksCiAgICAgICAgICAgICAgICAgIG1EaXN0X3NkID0gYWJzKHNjYWxlKG1EaXN0LGNlbnRlciA9IFQpKSkgJT4lCiAgICAjZHBseXI6Om11dGF0ZShtRGlzdE91dGxpZXIgPSAoc3RhdHM6OnBjaGlzcShtRGlzdCwgZGY9MSwgbG93ZXIudGFpbD1GQUxTRSkpIDwgLjAwMSkgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKG1EaXN0X3NkIDwgMikgJT4lCiAgICBkcGx5cjo6c2VsZWN0KCFjKEYxX21hZCwgRjJfbWFkLCBtRGlzdCwgbURpc3Rfc2QpKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoRjFfeiA9IHNjYWxlKEYxX0h6LCBjZW50ZXIgPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgRjJfeiA9IHNjYWxlKEYyX0h6LCBjZW50ZXIgPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgRjNfeiA9IHNjYWxlKEYzX0h6LCBjZW50ZXIgPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgRjFfYiA9IGVtdVI6OmJhcmsoRjFfSHopLAogICAgICAgICAgICAgICAgICBGMl9iID0gZW11Ujo6YmFyayhGMl9IeiksCiAgICAgICAgICAgICAgICAgIEYzX2IgPSBlbXVSOjpiYXJrKEYzX0h6KSkKICAKICBybShQaXRjaF9QUkFBVCkKICAKICAKIyMgQ29ybmVyIERpc3BlcnNpb24gLS0tLQogIHdlZGdlIDwtIHZvd2VsRGF0YSAlPiUKICAgIGRwbHlyOjpncm91cF9ieShWb3dlbCkgJT4lCiAgICBzdW1tYXJpemUobWVhbl9GMSA9IG1lYW4oRjFfdGVtcE1pZCksCiAgICAgICAgICAgICAgbWVhbl9GMiA9IG1lYW4oRjJfdGVtcE1pZCksCiAgICAgICAgICAgICAgbWVhbl9GMV96ID0gbWVhbihGMV96X3RlbXBNaWQpLAogICAgICAgICAgICAgIG1lYW5fRjJfeiA9IG1lYW4oRjJfel90ZW1wTWlkKSwKICAgICAgICAgICAgICBtZWFuX0YxX2IgPSBtZWFuKEYxX2JfdGVtcE1pZCksCiAgICAgICAgICAgICAgbWVhbl9GMl9iID0gbWVhbihGMl9iX3RlbXBNaWQpKSAlPiUKICAgIGRwbHlyOjpmaWx0ZXIoVm93ZWwgPT0gInYiKQogICAgCiAgY29ybmVyX2RpcyA8LSB2b3dlbERhdGEgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKFZvd2VsICE9ICJ2IikgJT4lCiAgICBkcGx5cjo6Z3JvdXBfYnkoVm93ZWwpICU+JQogICAgc3VtbWFyaXplKG1lYW5fRjEgPSBtZWFuKEYxX3RlbXBNaWQpLAogICAgICAgICAgICAgIG1lYW5fRjIgPSBtZWFuKEYyX3RlbXBNaWQpLAogICAgICAgICAgICAgIG1lYW5fRjFfeiA9IG1lYW4oRjFfel90ZW1wTWlkKSwKICAgICAgICAgICAgICBtZWFuX0YyX3ogPSBtZWFuKEYyX3pfdGVtcE1pZCksCiAgICAgICAgICAgICAgbWVhbl9GMV9iID0gbWVhbihGMV9iX3RlbXBNaWQpLAogICAgICAgICAgICAgIG1lYW5fRjJfYiA9IG1lYW4oRjJfYl90ZW1wTWlkKSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKFZvd2VsX0VEID0gc3FydCgobWVhbl9GMS13ZWRnZSRtZWFuX0YxKV4yICsgKG1lYW5fRjItd2VkZ2UkbWVhbl9GMileMiksCiAgICAgICAgICAgICAgICAgIFZvd2VsX0VEX3ogPSBzcXJ0KChtZWFuX0YxX3otd2VkZ2UkbWVhbl9GMV96KV4yICsgKG1lYW5fRjJfei13ZWRnZSRtZWFuX0YyX3opXjIpLAogICAgICAgICAgICAgICAgICBWb3dlbF9FRF9iID0gc3FydCgobWVhbl9GMV9iLXdlZGdlJG1lYW5fRjFfYileMiArIChtZWFuX0YyX2Itd2VkZ2UkbWVhbl9GMl9iKV4yKSkKCiAgICAKIyBQbG90IENvcm5lciBEaXNwZXJzaW9uCiAgICAgICMgQ2hhbmdpbmcgdG8gSVBBIHN5bWJvbHMKICAgICAgY29ybmVyX2RpcyA8LSBjb3JuZXJfZGlzICU+JQogICAgICAgIGRwbHlyOjptdXRhdGUoVm93ZWwgPSBjYXNlX3doZW4oCiAgICAgICAgICBWb3dlbCA9PSAiYWUiIH4gIsOmIiwKICAgICAgICAgIFRSVUUgfiBWb3dlbAogICAgICAgICkpCiAgICAgIAogICAgICB3ZWRnZSA8LSB3ZWRnZSAlPiUKICAgICAgICBkcGx5cjo6bXV0YXRlKFZvd2VsID0gY2FzZV93aGVuKAogICAgICAgICAgVm93ZWwgPT0gInYiIH4gIsqMIiwKICAgICAgICAgIFRSVUUgfiBWb3dlbAogICAgICAgICkpCiAgICAgIAogICAgICBDRHBsb3QgPC0gZ2dwbG90KGFlcyh4PUYyX2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9RjFfYiksCiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEZvcm1hbnRzX1BSQUFULAogICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UpICsgCiAgICAgIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwKICAgICAgICAgICAgICAgICBhbHBoYSA9IGZvcm1hbnRBbHBoYSwKICAgICAgICAgICAgICAgICBjb2xvciA9IGZvcm1hbnRDb2xvcikgKyAKICAgICAgZ2VvbV9saW5lKGFlcyh4ID0gbWVhbl9GMl9iLAogICAgICAgICAgICAgICAgICAgIHkgPSBtZWFuX0YxX2IpLAogICAgICAgICAgICAgICAgZGF0YSA9IGNvcm5lcl9kaXMgJT4lCiAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QoVm93ZWw6bWVhbl9GMl9iKSAlPiUKICAgICAgICAgICAgICAgICAgZHBseXI6OmZpbHRlcihWb3dlbCA9PSAiaSIpICU+JQogICAgICAgICAgICAgICAgICByYmluZCguLHdlZGdlKSwKICAgICAgICAgICAgICAgIGNvbG9yID0gbGluZUNvbG9yLAogICAgICAgICAgICAgICAgc2l6ZSA9IDEuNSwKICAgICAgICAgICAgICAgIGFscGhhID0gbGluZUFscGhhKSArCiAgICAgIGdlb21fbGluZShhZXMoeCA9IG1lYW5fRjJfYiwKICAgICAgICAgICAgICAgICAgICB5ID0gbWVhbl9GMV9iKSwKICAgICAgICAgICAgICAgIGRhdGEgPSBjb3JuZXJfZGlzICU+JQogICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KFZvd2VsOm1lYW5fRjJfYikgJT4lCiAgICAgICAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoVm93ZWwgPT0gImEiKSAlPiUKICAgICAgICAgICAgICAgICAgcmJpbmQoLix3ZWRnZSksCiAgICAgICAgICAgICAgICBjb2xvciA9IGxpbmVDb2xvciwKICAgICAgICAgICAgICAgIHNpemUgPSAxLjUsCiAgICAgICAgICAgICAgICBhbHBoYSA9IGxpbmVBbHBoYSkgKwogICAgICBnZW9tX2xpbmUoYWVzKHggPSBtZWFuX0YyX2IsCiAgICAgICAgICAgICAgICAgICAgeSA9IG1lYW5fRjFfYiksCiAgICAgICAgICAgICAgICBkYXRhID0gY29ybmVyX2RpcyAlPiUKICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChWb3dlbDptZWFuX0YyX2IpICU+JQogICAgICAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKFZvd2VsID09ICLDpiIpICU+JQogICAgICAgICAgICAgICAgICByYmluZCguLHdlZGdlKSwKICAgICAgICAgICAgICAgIGNvbG9yID0gbGluZUNvbG9yLAogICAgICAgICAgICAgICAgc2l6ZSA9IDEuNSwKICAgICAgICAgICAgICAgIGFscGhhID0gbGluZUFscGhhKSArCiAgICAgIGdlb21fbGluZShhZXMoeCA9IG1lYW5fRjJfYiwKICAgICAgICAgICAgICAgICAgICB5ID0gbWVhbl9GMV9iKSwKICAgICAgICAgICAgICAgIGRhdGEgPSBjb3JuZXJfZGlzICU+JQogICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KFZvd2VsOm1lYW5fRjJfYikgJT4lCiAgICAgICAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoVm93ZWwgPT0gInUiKSAlPiUKICAgICAgICAgICAgICAgICAgcmJpbmQoLix3ZWRnZSksCiAgICAgICAgICAgICAgICBjb2xvciA9IGxpbmVDb2xvciwKICAgICAgICAgICAgICAgIHNpemUgPSAxLjUsCiAgICAgICAgICAgICAgICBhbHBoYSA9IGxpbmVBbHBoYSkgKwogICAgICBnZW9tX3BvaW50KGFlcyh4ID0gbWVhbl9GMl9iLAogICAgICAgICAgICAgICAgICAgICB5ID0gbWVhbl9GMV9iLAogICAgICAgICAgICAgICAgICAgICBjb2xvciA9IFZvd2VsKSwKICAgICAgICAgICAgICAgICBkYXRhID0gY29ybmVyX2RpcyAlPiUKICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdChWb3dlbDptZWFuX0YyX2IpICU+JQogICAgICAgICAgICAgICAgICByYmluZCguLHdlZGdlKSwKICAgICAgICAgICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFLAogICAgICAgICAgICAgICAgIHNpemUgPSA1KSArCiAgICAgIHNjYWxlX3lfcmV2ZXJzZSgpICsKICAgICAgc2NhbGVfeF9yZXZlcnNlKCkgKwogICAgICB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHRpdGxlID0gcGFzdGUoIkNvcm5lciBEaXNwZXJzaW9uIikpICsgeGxhYigiRjIgKGJhcmspIikgKyB5bGFiKCJGMSAoYmFyaykiKSArCiAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgICAgICBhc3BlY3QucmF0aW8gPSAxKSArCiAgICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYSIgPSAiIzFBQUQ3NyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiw6YiID0gIiMxMjc5QjUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkiID0gIiNGRkJGMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInUiID0gIiNGRDc4NTMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIsqMIiA9ICIjQkYzMTc4IikpCiAgICBDRHBsb3QKICAgIAogICAgICBybShjb3JuZXJfZGlzLCB3ZWRnZSkKICAgICAgCiMjIFZvd2VsIFNwYWNlIEFyZWEgLS0tLQogIFZTQV9jb29yZHMgPC0gdm93ZWxEYXRhICU+JQogICAgZHBseXI6OmZpbHRlcihWb3dlbCAhPSAidiIpICU+JQogICAgZHBseXI6Omdyb3VwX2J5KFZvd2VsKSAlPiUKICAgIHN1bW1hcml6ZShtZWFuX0YxID0gbWVhbihGMV90ZW1wTWlkKSwKICAgICAgICAgICAgICBtZWFuX0YyID0gbWVhbihGMl90ZW1wTWlkKSwKICAgICAgICAgICAgICBtZWFuX0YxX3ogPSBtZWFuKEYxX3pfdGVtcE1pZCksCiAgICAgICAgICAgICAgbWVhbl9GMl96ID0gbWVhbihGMl96X3RlbXBNaWQpLAogICAgICAgICAgICAgIG1lYW5fRjFfYiA9IG1lYW4oRjFfYl90ZW1wTWlkKSwKICAgICAgICAgICAgICBtZWFuX0YyX2IgPSBtZWFuKEYyX2JfdGVtcE1pZCkpIAogIAojIyMgUGxvdHRpbmcgVlNBCiAgICBWU0FfY29vcmRzIDwtIFZTQV9jb29yZHMgJT4lCiAgICAgICAgZHBseXI6Om11dGF0ZShWb3dlbCA9IGNhc2Vfd2hlbigKICAgICAgICAgIFZvd2VsID09ICJhZSIgfiAiw6YiLAogICAgICAgICAgVFJVRSB+IFZvd2VsCiAgICAgICAgKSkKICAgIAogICAgVlNBcGxvdCA8LSBnZ3Bsb3QoYWVzKHggPSBGMl9iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBGMV9iKSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBGb3JtYW50c19QUkFBVCwKICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UpICsgCiAgICAgIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwKICAgICAgICAgICAgICAgICBhbHBoYSA9IGZvcm1hbnRBbHBoYSwKICAgICAgICAgICAgICAgICBjb2xvciA9IGZvcm1hbnRDb2xvcikgKyAKICAgICAgZ2VvbV9wb2x5Z29uKGFlcyh4ID0gbWVhbl9GMl9iLAogICAgICAgICAgICAgICAgICAgICAgIHkgPSBtZWFuX0YxX2IpLAogICAgICAgICAgICAgICAgICAgZGF0YSA9IFZTQV9jb29yZHMsCiAgICAgICAgICAgICAgICAgICBhbHBoYSA9IGxpbmVBbHBoYSwKICAgICAgICAgICAgICAgICAgIGNvbG9yID0gbGluZUNvbG9yLAogICAgICAgICAgICAgICAgICAgZmlsbD1OQSwKICAgICAgICAgICAgICAgICAgIHNpemUgPSAxLjUpICsKICAgICAgZ2VvbV9wb2ludChhZXMoeCA9IG1lYW5fRjJfYiwKICAgICAgICAgICAgICAgICAgICAgeSA9IG1lYW5fRjFfYiwKICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBWb3dlbCksCiAgICAgICAgICAgICAgICAgZGF0YSA9IFZTQV9jb29yZHMsCiAgICAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSwKICAgICAgICAgICAgICAgICBzaXplID0gNSkgKwogICAgICBzY2FsZV95X3JldmVyc2UoKSArCiAgICAgIHNjYWxlX3hfcmV2ZXJzZSgpICsKICAgICAgZ3VpZGVzKGNvbG9yID0gRkFMU0UpICsKICAgICAgdGhlbWVfY2xhc3NpYygpICsgbGFicyh0aXRsZSA9ICJWU0EiKSArIHhsYWIoIkYyIChiYXJrKSIpICsgeWxhYigiRjEgKGJhcmspIikgKwogICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICAgICAgYXNwZWN0LnJhdGlvID0gMSkgKwogICAgICAgICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImEiID0gIiMxQUFENzciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIsOmIiA9ICIjMTI3OUI1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpIiA9ICIjRkZCRjAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1IiA9ICIjRkQ3ODUzIikpCiAgICBWU0FwbG90CiAgCiAgcm0oVlNBX2Nvb3JkcykKICAKIyMgSHVsbCAtLS0tCgojIyMgUGxvdHRpbmcgSHVsbAogICAgICBjb252ZXhDb29yZHMgPC0gRm9ybWFudHNfUFJBQVQgJT4lCiAgICAgICAgZHBseXI6OnNlbGVjdChGMV9iLCBGMl9iKSAlPiUKICAgICAgICBhcy5tYXRyaXgoKSAlPiUKICAgICAgICBnckRldmljZXM6OmNodWxsKCkKICAgICAgY29udmV4IDwtIEZvcm1hbnRzX1BSQUFUICU+JQogICAgICAgIHNsaWNlKGNvbnZleENvb3JkcykKCiAgICAgIGh1bGxQbG90IDwtIGdncGxvdChhZXMoRjJfYiwgRjFfYiksCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gRm9ybWFudHNfUFJBQVQpICsKICAgICAgICBnZW9tX3BvaW50KHNoYXBlID0gMjEsCiAgICAgICAgICAgICAgICAgYWxwaGEgPSBmb3JtYW50QWxwaGEsCiAgICAgICAgICAgICAgICAgY29sb3IgPSBmb3JtYW50Q29sb3IpICsKICAgICAgICBnZW9tX3BvbHlnb24oZGF0YSA9IGNvbnZleCwKICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAuNSwKICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIzEyNzlCNSIsCiAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBOQSwKICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDEuNSkgKwogICAgICAgIHNjYWxlX3lfcmV2ZXJzZSgpICsKICAgICAgICBzY2FsZV94X3JldmVyc2UoKSArCiAgICAgICAgdGhlbWVfY2xhc3NpYygpICsgbGFicyh0aXRsZSA9ICJWU0EgSHVsbCIpICsgeGxhYigiRjIgKGJhcmspIikgKyB5bGFiKCJGMSAoYmFyaykiKSArCiAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgICAgICBhc3BlY3QucmF0aW8gPSAxKQogICAgICBodWxsUGxvdAogICAgCiAgCiMjIFZvd2VsIFNwYWNlIERlbnNpdHkgLS0tLQoKIyMgQmFyayBOb3JtYWxpemVkIERlbnNpdHkgLS0tLQojIHNlbGVjdGluZyB0aGUgYmFuZHdpZHRoCkhfaHBpIDwtIGtzOjpIcGkoeCA9IEZvcm1hbnRzX1BSQUFUWyxjKCJGMl9iIiwiRjFfYiIpXSwgcGlsb3QgPSAic2Ftc2UiLCBwcmUgPSAic2NhbGUiLCBiaW5uZWQgPSBUKQoKIyBjb21wdXRlIDJkIGtkZQprIDwtIGtkZSh4ID0gRm9ybWFudHNfUFJBQVRbLGMoIkYyX2IiLCJGMV9iIildLAogICAgICAgICBIID0gSF9ocGksCiAgICAgICAgIGJpbm5lZCA9IFQsCiAgICAgICAgIGdyaWRzaXplID0gMjUwKQoKI2RlbnNpdHkgPC0ga1tbImVzdGltYXRlIl1dCgojIEJlZm9yZSB3ZSBjYW4gcGxvdCB0aGUgZGVuc2l0eSBlc3RpbWF0ZSB3ZSBuZWVkIHRvIG1lbHQgaXQgaW50byBsb25nIGZvcm1hdAptYXQubWVsdGVkIDwtIGRhdGEudGFibGU6Om1lbHQoayRlc3RpbWF0ZSkKbmFtZXMobWF0Lm1lbHRlZCkgPC0gYygieCIsICJ5IiwgImRlbnNpdHkiKQoKIyBXZSBuZWVkIHRvIGFkZCB0d28gbW9yZSBjb2x1bXMgdG8gcHJlc2VydmUgdGhlIGF4ZXMgdW5pdHMKbWF0Lm1lbHRlZCRGMi5iIDwtIHJlcChrJGV2YWwucG9pbnRzW1sxXV0sIHRpbWVzID0gbnJvdyhrJGVzdGltYXRlKSkKbWF0Lm1lbHRlZCRGMS5iIDwtIHJlcChrJGV2YWwucG9pbnRzW1syXV0sIGVhY2ggPSBucm93KGskZXN0aW1hdGUpKQptYXQubWVsdGVkJGRlbnNpdHkgPC0gc2NhbGVzOjpyZXNjYWxlKG1hdC5tZWx0ZWQkZGVuc2l0eSwgdG8gPSBjKDAsIDEpKQoKIyBWU0QgLSAyNQpuVlNEXzI1IDwtIG1hdC5tZWx0ZWQgJT4lCiAgZHBseXI6OmZpbHRlcihkZW5zaXR5ID4gLjI1KSAlPiUKICBkcGx5cjo6c2VsZWN0KEYyLmIsRjEuYikKCmNvbnZleENvb3JkcyA8LSBuVlNEXzI1ICU+JQogIGRwbHlyOjpzZWxlY3QoRjIuYiwgRjEuYikgJT4lCiAgYXMubWF0cml4KCkgJT4lCiAgI2dyRGV2aWNlczo6eHkuY29vcmRzKCkgJT4lCiAgZ3JEZXZpY2VzOjpjaHVsbCgpCm5jb252ZXhfMjUgPC0gblZTRF8yNSAlPiUKICBzbGljZShjb252ZXhDb29yZHMpCgojIFZTRCAtIDc1Cm5WU0RfNzUgPC0gbWF0Lm1lbHRlZCAlPiUKICBkcGx5cjo6ZmlsdGVyKGRlbnNpdHkgPiAuNzUpICU+JQogIGRwbHlyOjpzZWxlY3QoRjIuYixGMS5iKQoKY29udmV4Q29vcmRzIDwtIG5WU0RfNzUgJT4lCiAgZHBseXI6OnNlbGVjdChGMi5iLCBGMS5iKSAlPiUKICBhcy5tYXRyaXgoKSAlPiUKICBnckRldmljZXM6OmNodWxsKCkKbmNvbnZleF83NSA8LSBuVlNEXzc1ICU+JQogIHNsaWNlKGNvbnZleENvb3JkcykKCiMgUGxvdHRpbmcgWiBOb3JtYWxpemVkIFZTRCAKICAgIHJmIDwtIGNvbG9yUmFtcFBhbGV0dGUocmV2KFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCgxMSwgIlNwZWN0cmFsIikpKQogICAgciA8LSByZigzMikKCiAgICBWU0RwbG90IDwtIGdncGxvdChkYXRhID0gbWF0Lm1lbHRlZCAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnJlbmFtZShEZW5zaXR5ID0gZGVuc2l0eSkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjptdXRhdGUoVlNEbGFiZWwgPSBjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2l0eSA8IC4yNSB+ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zaXR5ID4gLjI1ICYmIERlbnNpdHkgPCAuNzUgfiAiVlNEMjUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiVlNENzUiCiAgICAgICAgICAgICAgICAgICAgICAgICkpLAogICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBGMi5iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBGMS5iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBEZW5zaXR5KSkgKyAKICAgICAgZ2VvbV90aWxlKCkgKyAKICAgICAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IHIpICsKICAgICAgc2NhbGVfeF9yZXZlcnNlKGV4cGFuZCA9IGMoMCwgMCksIAogICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gcm91bmQoc2VxKG1pbihtYXQubWVsdGVkJEYyLmIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgobWF0Lm1lbHRlZCRGMi5iKSkpKSArCiAgICAgIHNjYWxlX3lfcmV2ZXJzZShleHBhbmQgPSBjKDAsIDApLAogICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gcm91bmQoc2VxKG1pbihtYXQubWVsdGVkJEYxLmIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChtYXQubWVsdGVkJEYxLmIpKSkpICsgCiAgICAgIHlsYWIoIkYxIChiYXJrKSIpICsgeGxhYigiRjIgKGJhcmspIikgKwogICAgICBsYWJzKHRpdGxlID0gIlZTRCBIdWxsIikgKwogICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICAgICAgYXNwZWN0LnJhdGlvID0gMSkgKwogICAgICBnZW9tX3BvbHlnb24oZGF0YSA9IG5jb252ZXhfMjUsIGFscGhhID0gbGluZUFscGhhLCBjb2xvciA9IGxpbmVDb2xvciwgc2l6ZSA9IDEuNSwgZmlsbCA9IE5BKSArCiAgICAgIGdlb21fcG9seWdvbihkYXRhID0gbmNvbnZleF83NSwgYWxwaGEgPSBsaW5lQWxwaGEsIGNvbG9yID0gbGluZUNvbG9yLCBzaXplID0gMS41LCBmaWxsID0gTkEpCiAgICBWU0RwbG90CiAgICAKCgojIENvbWJpbmVkIFBsb3QKCm1lYXN1cmVzUGxvdCA8LSBWU0FwbG90ICsgQ0RwbG90ICsgaHVsbFBsb3QgKyBWU0RwbG90ICsKICAgICAgcGF0Y2h3b3JrOjpwbG90X2xheW91dChndWlkZXMgPSAnY29sbGVjdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpCgpnZ3NhdmUoZmlsZW5hbWUgPSAiUGxvdHMvTWVhc3VyZXMucG5nIiwKICAgICAgIHBsb3QgPSBtZWFzdXJlc1Bsb3QsCiAgICAgICBoZWlnaHQgPSA3LAogICAgICAgd2lkdGggPSA4LAogICAgICAgc2NhbGUgPSAuOCkKCmBgYAoKIyMgRmlsdGVyaW5nIFByb2Nlc3MKYGBge3J9CmZvcm1hbnRBbHBoYSA8LSAuMjAKbXlQYWwgPC0gYygiIzEyNzlCNSIsIiMyRDJEMzciKQoKUGl0Y2hfUFJBQVQgPC0gbGlzdC5maWxlcyhwYXRoID0gcGFzdGUoIlByZXBwZWQgRGF0YS9FeGFtcGxlIERhdGEvIiwgc2VwID0gIiIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICIuUGl0Y2giLCBpZ25vcmUuY2FzZSA9IFQpICU+JQogICAgcGFzdGUoIlByZXBwZWQgRGF0YS9FeGFtcGxlIERhdGEvIiwuLCBzZXAgPSAiIikgJT4lCiAgICByZWFkLmRlbGltKC4sIGhlYWRlciA9IEYpICU+JQogICAgZHBseXI6OnJlbmFtZShQaXRjaCA9IFYxKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoUGl0Y2ggPSBnc3ViKCItLXVuZGVmaW5lZC0tIixOQSxQaXRjaCksCiAgICAgICAgICAgICAgICAgIFBpdGNoID0gYXMubnVtZXJpYyhQaXRjaCkpCgpGb3JtYW50c19QUkFBVCA8LSBsaXN0LmZpbGVzKHBhdGggPSBwYXN0ZSgiUHJlcHBlZCBEYXRhL0V4YW1wbGUgRGF0YS8iLCBzZXAgPSAiIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIl9Gb3JtYW50IiwgaWdub3JlLmNhc2UgPSBUKSAlPiUKICAgIHBhc3RlKCJQcmVwcGVkIERhdGEvRXhhbXBsZSBEYXRhLyIsLiwgc2VwID0gIiIpICU+JQogICAgcmVhZC5kZWxpbSguLCBoZWFkZXIgPSBUKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoIWMobmZvcm1hbnRzLCBCMS5Iei4sIEIyLkh6LiwgQjMuSHouLCBGNC5Iei4sIEI0Lkh6LiwgRjUuSHouLCBCNS5Iei4pKSAlPiUKICAgIGRwbHlyOjpyZW5hbWUoVGltZV9zID0gdGltZS5zLiwKICAgICAgICAgICAgICAgICAgRjFfSHogPSBGMS5Iei4sCiAgICAgICAgICAgICAgICAgIEYyX0h6ID0gRjIuSHouLAogICAgICAgICAgICAgICAgICBGM19IeiA9IEYzLkh6LikgJT4lCiAgICBkcGx5cjo6bXV0YXRlKEYxX0h6ID0gaWZlbHNlKEYxX0h6ID09IDAsIE5BLCBGMV9IeiksCiAgICAgICAgICAgICAgICAgIEYyX0h6ID0gaWZlbHNlKEYyX0h6ID09IDAsIE5BLCBGMl9IeiksCiAgICAgICAgICAgICAgICAgIEYzX0h6ID0gaWZlbHNlKEYzX0h6ID09IDAsIE5BLCBGM19IeikpICU+JQogICAgZHBseXI6Om11dGF0ZShGMV9IeiA9IGFzLm51bWVyaWMoRjFfSHopLAogICAgICAgICAgICAgICAgICBGMl9IeiA9IGFzLm51bWVyaWMoRjJfSHopLAogICAgICAgICAgICAgICAgICBGM19IeiA9IHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyhGM19IeikpLAogICAgICAgICAgICAgICAgICBUaW1lX21zID0gVGltZV9zIC8gMTAwMCwKICAgICAgICAgICAgICAgICAgRjFfa0h6ID0gRjFfSHogLyAxMDAwLAogICAgICAgICAgICAgICAgICBGMl9rSHogPSBGMl9IeiAvIDEwMDAsCiAgICAgICAgICAgICAgICAgIEYzX2tIeiA9IEYzX0h6IC8gMTAwMCwKICAgICAgICAgICAgICAgICAgRjFfYiA9IGVtdVI6OmJhcmsoRjFfSHopLAogICAgICAgICAgICAgICAgICBGMl9iID0gZW11Ujo6YmFyayhGMl9IeiksCiAgICAgICAgICAgICAgICAgIEYzX2IgPSBlbXVSOjpiYXJrKEYzX0h6KSkgJT4lCiAgICBkcGx5cjo6c2VsZWN0KCFUaW1lX3MpICU+JQogICAgZHBseXI6OnJlbG9jYXRlKFRpbWVfbXMsIC5iZWZvcmUgPSBGMV9IeikgJT4lCiAgICBjYmluZCguLFBpdGNoX1BSQUFUKQogIAogIGMgPC0gMgogIHdoaWxlKGMgPCBOUk9XKEZvcm1hbnRzX1BSQUFUKSl7CiAgICBGb3JtYW50c19QUkFBVCRGMV9IeltjXSA8LSBpZmVsc2UoaXMubmEoRm9ybWFudHNfUFJBQVQkRjFfSHpbYy0xXSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKEZvcm1hbnRzX1BSQUFUJEYxX0h6W2MrMV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hbnRzX1BSQUFUJEYxX0h6W2NdKQogICAgRm9ybWFudHNfUFJBQVQkRjJfSHpbY10gPC0gaWZlbHNlKGlzLm5hKEZvcm1hbnRzX1BSQUFUJEYyX0h6W2MtMV0pICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShGb3JtYW50c19QUkFBVCRGMl9IeltjKzFdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYW50c19QUkFBVCRGMl9IeltjXSkKICAgIGMgPC0gYyArIDEKICB9CiAgcm0oYykKICAKICAjIFJhdyBGb3JtYW50cyAtLS0tCiAgZjEgPC0gZ2dwbG90KGFlcyh4PUYyX2IsCiAgICAgICAgICAgICAgICAgICB5PUYxX2IpLAogICAgICAgICAgICAgICBkYXRhID0gRm9ybWFudHNfUFJBQVQpICsgCiAgICAgIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgY29sb3IgPSBteVBhbFsyXSkgKwogICAgICBzY2FsZV95X3JldmVyc2UoKSArCiAgICAgIHNjYWxlX3hfcmV2ZXJzZSgpICsKICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IG15UGFsKSArCiAgICAgIHRoZW1lX2NsYXNzaWMoKSArIGxhYnModGl0bGUgPSBwYXN0ZSgiUmF3IEZvcm1hbnQgVmFsdWVzIikpICsgeGxhYigiRjIgKGJhcmspIikgKyB5bGFiKCJGMSAoYmFyaykiKSArCiAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgICAgICBhc3BlY3QucmF0aW8gPSAxLAogICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKQogICAgCiMgU3RlcCAjMTogVm9pY2VkIFNlZ21lbnRzIC0tLS0KICAgIHBsb3REYXRhIDwtIEZvcm1hbnRzX1BSQUFUICU+JQogICAgICAgICAgICAgICAgICAgZHBseXI6Om11dGF0ZShpc091dGxpZXIgPSBjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgICAgIGlzLm5hKFBpdGNoKSB+ICJSZW1vdmVkIiwKICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJSZXRhaW5lZCIKICAgICAgICAgICAgICAgICAgICkpCiAgICBmMiA8LSBnZ3Bsb3QoZGF0YSA9IHBsb3REYXRhLAogICAgICAgICAgICAgICAgIGFlcyh4ID0gRjJfYiwKICAgICAgICAgICAgICAgICAgICAgeSA9IEYxX2IsCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gaXNPdXRsaWVyKSkgKyAKICAgICAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCBkYXRhID0gcGxvdERhdGEgJT4lCiAgICAgICAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGlzT3V0bGllciA9PSAiUmVtb3ZlZCIpKSArCiAgICAgIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgZGF0YSA9IHBsb3REYXRhICU+JQogICAgICAgICAgICAgZHBseXI6OmZpbHRlcihpc091dGxpZXIgPT0gIlJldGFpbmVkIikpICsKICAgICAgc2NhbGVfeV9yZXZlcnNlKCkgKwogICAgICBzY2FsZV94X3JldmVyc2UoKSArCiAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBteVBhbCkgKwogICAgICB0aGVtZV9jbGFzc2ljKCkgKyBsYWJzKHRpdGxlID0gcGFzdGUoIlN0ZXAgIzE6XG5Wb2ljZWQgU2VnbWVudHMiKSkgKwogICAgICB4bGFiKCJGMiAoYmFyaykiKSArCiAgICAgIHlsYWIoIkYxIChiYXJrKSIpICsKICAgICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksCiAgICAgICAgICAgIGFzcGVjdC5yYXRpbyA9IDEsCiAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMikpCiAgICAKIyBTdGVwIDI6IE1BRCAtLS0tCiAgICBwbG90RGF0YSA8LSBGb3JtYW50c19QUkFBVCAlPiUKICAgICAgZHBseXI6OmZpbHRlcighaXMubmEoUGl0Y2gpKSAlPiUKICAgICAgZHBseXI6Om11dGF0ZShGMV9tYWQgPSAoYWJzKEYxX0h6IC0gbWVkaWFuKEYxX0h6KSkvIG1hZChGMV9IeiwgY29uc3RhbnQgPSAxLjQ4MjYpKSA+IDIuNSwKICAgICAgICAgICAgICAgICAgICBGMl9tYWQgPSAoYWJzKEYyX0h6IC0gbWVkaWFuKEYyX0h6KSkvIG1hZChGMl9IeiwgY29uc3RhbnQgPSAxLjQ4MjYpKSA+IDIuNSwKICAgICAgICAgICAgICAgICAgICBpc091dGxpZXIgPSBjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgICAgICBGMV9tYWQgPT0gVFJVRSB8IEYyX21hZCA9PSBUUlVFIH4gIlJlbW92ZWQiLAogICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJSZXRhaW5lZCIKICAgICAgICAgICAgICAgKSkKICAgIAogICAgZjMgPC0gZ2dwbG90KGRhdGEgPSBwbG90RGF0YSwKICAgICAgICAgICAgICAgICBhZXMoeCA9IEYyX2IsCiAgICAgICAgICAgICAgICAgICAgIHkgPSBGMV9iLAogICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGlzT3V0bGllcikpICsgCiAgICAgIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgZGF0YSA9IHBsb3REYXRhICU+JQogICAgICAgICAgICAgICAgICAgZHBseXI6OmZpbHRlcihpc091dGxpZXIgPT0gIlJlbW92ZWQiKSkgKwogICAgICBnZW9tX3BvaW50KHNoYXBlID0gMjEsIGRhdGEgPSBwbG90RGF0YSAlPiUKICAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoaXNPdXRsaWVyID09ICJSZXRhaW5lZCIpKSArCiAgICAgIHNjYWxlX3lfcmV2ZXJzZSgpICsKICAgICAgc2NhbGVfeF9yZXZlcnNlKCkgKwogICAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbXlQYWwpICsKICAgICAgdGhlbWVfY2xhc3NpYygpICsKICAgICAgbGFicyh0aXRsZSA9IHBhc3RlKCJTdGVwICMyOlxuTWVkaWFuIEFic29sdXRlIERldmlhdGlvbiIpKSArCiAgICAgIHhsYWIoIkYyIChiYXJrKSIpICsKICAgICAgeWxhYigiRjEgKGJhcmspIikgKwogICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICAgICAgYXNwZWN0LnJhdGlvID0gMSwKICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSkKICAgIAojIFN0ZXAgMzogTWFoYWxhbmhvYmlzIERpc3RhbmNlIC0tLS0KICBwbG90RGF0YSA8LSBGb3JtYW50c19QUkFBVCAlPiUKICAgICAgZHBseXI6OmZpbHRlcighaXMubmEoUGl0Y2gpKSAlPiUKICAgICAgZHBseXI6Om11dGF0ZShGMV9tYWQgPSAoYWJzKEYxX0h6IC0gbWVkaWFuKEYxX0h6KSkvIG1hZChGMV9IeiwgY29uc3RhbnQgPSAxLjQ4MjYpKSA+IDIuNSwKICAgICAgICAgICAgICAgICAgICBGMl9tYWQgPSAoYWJzKEYyX0h6IC0gbWVkaWFuKEYyX0h6KSkvIG1hZChGMl9IeiwgY29uc3RhbnQgPSAxLjQ4MjYpKSA+IDIuNSkgJT4lCiAgICAgIGRwbHlyOjpmaWx0ZXIoRjFfbWFkID09IEZBTFNFICYgRjJfbWFkID09IEZBTFNFKSAlPiUKICAgICAgZHBseXI6Om11dGF0ZShtRGlzdCA9IG1haGFsYW5vYmlzKGNiaW5kKC4kRjFfSHosIC4kRjJfSHopLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbE1lYW5zKGNiaW5kKC4kRjFfSHosIC4kRjJfSHopKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3YgPSBjb3YoY2JpbmQoLiRGMV9IeiwgLiRGMl9IeikpKSwKICAgICAgICAgICAgICAgICAgbURpc3Rfc2QgPSBhYnMoc2NhbGUobURpc3QsY2VudGVyID0gVCkpLAogICAgICAgICAgICAgICAgICBpc091dGxpZXIgPSBjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgICAgbURpc3Rfc2QgPCAyIH4gIlJldGFpbmVkIiwKICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIlJlbW92ZWQiCiAgICAgICAgICAgICAgICAgICkpCiAgICAKICAgIGY0IDwtIGdncGxvdChkYXRhID0gcGxvdERhdGEsCiAgICAgICAgICAgICAgICAgYWVzKHggPSBGMl9iLAogICAgICAgICAgICAgICAgICAgICB5ID0gRjFfYiwKICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBpc091dGxpZXIpKSArIAogICAgICBnZW9tX3BvaW50KHNoYXBlID0gMjEsIGRhdGEgPSBwbG90RGF0YSAlPiUKICAgICAgICAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoaXNPdXRsaWVyID09ICJSZW1vdmVkIikpICsKICAgICAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCBkYXRhID0gcGxvdERhdGEgJT4lCiAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGlzT3V0bGllciA9PSAiUmV0YWluZWQiKSkgKwogICAgICBzY2FsZV95X3JldmVyc2UoKSArCiAgICAgIHNjYWxlX3hfcmV2ZXJzZSgpICsKICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IG15UGFsKSArCiAgICAgIHRoZW1lX2NsYXNzaWMoKSArIGxhYnModGl0bGUgPSBwYXN0ZSgiU3RlcCAjMzpcbk1haGFsYW5vYmlzIERpc3RhbmNlIikpICsgeGxhYigiRjIgKGJhcmspIikgKyB5bGFiKCJGMSAoYmFyaykiKSArCiAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgICAgICBhc3BlY3QucmF0aW8gPSAxLAogICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKQogICAgCiMgRmluYWwgRm9ybWFudHMgLS0tLQogICAgcGxvdERhdGEgPC0gRm9ybWFudHNfUFJBQVQgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShQaXRjaCkpICU+JQogICAgZHBseXI6Om11dGF0ZShGMV9tYWQgPSAoYWJzKEYxX0h6IC0gbWVkaWFuKEYxX0h6KSkvIG1hZChGMV9IeiwgY29uc3RhbnQgPSAxLjQ4MjYpKSA+IDIuNSwKICAgICAgICAgICAgICAgICAgRjJfbWFkID0gKGFicyhGMl9IeiAtIG1lZGlhbihGMl9IeikpLyBtYWQoRjJfSHosIGNvbnN0YW50ID0gMS40ODI2KSkgPiAyLjUpICU+JQogICAgZHBseXI6OmZpbHRlcihGMV9tYWQgPT0gRkFMU0UgJiBGMl9tYWQgPT0gRkFMU0UpICU+JQogICAgZHBseXI6Om11dGF0ZShtRGlzdCA9IG1haGFsYW5vYmlzKGNiaW5kKC4kRjFfSHosIC4kRjJfSHopLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbE1lYW5zKGNiaW5kKC4kRjFfSHosIC4kRjJfSHopKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3YgPSBjb3YoY2JpbmQoLiRGMV9IeiwgLiRGMl9IeikpKSwKICAgICAgICAgICAgICAgICAgbURpc3Rfc2QgPSBhYnMoc2NhbGUobURpc3QsY2VudGVyID0gVCkpKSAlPiUKICAgIGRwbHlyOjpmaWx0ZXIobURpc3Rfc2QgPCAyKQogICAgCiAgICBmNSA8LSBnZ3Bsb3QoYWVzKHg9RjJfYiwKICAgICAgICAgICAgICAgICAgICAgeT1GMV9iKSwKICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gcGxvdERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSkgKyAKICAgICAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCBjb2xvciA9IG15UGFsWzJdKSArIAogICAgICBzY2FsZV95X3JldmVyc2UoKSArCiAgICAgIHNjYWxlX3hfcmV2ZXJzZSgpICsKICAgICAgdGhlbWVfY2xhc3NpYygpICsgbGFicyh0aXRsZSA9IHBhc3RlKCJGaW5hbCBGb3JtYW50IFZhbHVlcyIpKSArIHhsYWIoIkYyIChiYXJrKSIpICsgeWxhYigiRjEgKGJhcmspIikgKwogICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICAgICAgYXNwZWN0LnJhdGlvID0gMSwgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQogICAgCiMgQ29taWJpbmcgcGxvdHMKICAgIGZpbHRlcmVkUGxvdCA8LSBmMSArIGYyICsgZjMgKyBmNCArIGY1ICsgcGF0Y2h3b3JrOjpndWlkZV9hcmVhKCkgKwogICAgICBwYXRjaHdvcms6OnBsb3RfbGF5b3V0KGd1aWRlcyA9ICdjb2xsZWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAzKQogICAgZmlsdGVyZWRQbG90CiAgICAKICAgIGdnc2F2ZShwbG90ID0gZmlsdGVyZWRQbG90LCAiUGxvdHMvRmlsdGVyZWQgRm9ybWFudHMucG5nIiwKICAgICAgICAgICBoZWlnaHQgPSA2LAogICAgICAgICAgIHdpZHRoID0gOCwKICAgICAgICAgICB1bml0cyA9ICJpbiIsCiAgICAgICAgICAgc2NhbGUgPSAuOSkKICAKYGBgCgojIyBPVCB2cy4gVkFTCmBgYHtyfQpwbG90RGF0YV9JbnQgPC0gQWNvdXN0aWNEYXRhICU+JQogIGRwbHlyOjpmaWx0ZXIoIWdyZXBsKCJfcmVsIiwgU3BlYWtlcikpICU+JQogIGRwbHlyOjpncm91cF9ieShTcGVha2VyKSAlPiUKICBkcGx5cjo6bXV0YXRlKHNlZ01pbiA9IGJhc2U6Om1pbihWQVMsIHRyYW5zQWNjKSwKICAgICAgICAgICAgICAgIHNlZ01heCA9IGJhc2U6Om1heChWQVMsIHRyYW5zQWNjKSwKICAgICAgICAgICAgICAgIHJhdGluZ0F2ZyA9IG1lYW4oVkFTLCB0cmFuc0FjYywgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgIFNwZWFrZXIgPSBhcy5mYWN0b3IoU3BlYWtlciksCiAgICAgICAgICAgICAgICBFdGlvbG9neSA9IGFzLmZhY3RvcihFdGlvbG9neSkpICU+JQogIGFycmFuZ2Uoc2VnTWF4KQoKbXlfcGFsIDwtIGMoIiNmMjY0MzAiLCAiIzI3MkQyRCIsIiMyNTZlZmYiKQojIFdpdGggYSBiaXQgbW9yZSBzdHlsZQpwbG90X0ludCA8LSBnZ3Bsb3QocGxvdERhdGFfSW50KSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gZmN0X2lub3JkZXIoU3BlYWtlciksCiAgICAgICAgICAgICAgICAgICB4ZW5kID0gU3BlYWtlciwKICAgICAgICAgICAgICAgICAgIHkgPSBzZWdNaW4sCiAgICAgICAgICAgICAgICAgICB5ZW5kID0gc2VnTWF4LAogICAgICAgICAgICAgICAgICAgY29sb3IgPSBFdGlvbG9neSkpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gU3BlYWtlciwKICAgICAgICAgICAgICAgICB5ID0gVkFTLAogICAgICAgICAgICAgICAgIGNvbG9yID0gRXRpb2xvZ3kpLAogICAgICAgICAgICAgI2NvbG9yID0gbXlfcGFsWzFdLAogICAgICAgICAgICAgc2l6ZSA9IDMsCiAgICAgICAgICAgICBzaGFwZSA9IDE5KSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IFNwZWFrZXIsCiAgICAgICAgICAgICAgICAgeSA9IHRyYW5zQWNjLAogICAgICAgICAgICAgICAgIGNvbG9yID0gRXRpb2xvZ3kpLAogICAgICAgICAgICAgI2NvbG9yID0gbXlfcGFsWzJdLAogICAgICAgICAgICAgc2l6ZSA9IDMsCiAgICAgICAgICAgICBzaGFwZSA9IDE1KSArCiAgY29vcmRfZmxpcCgpKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksCiAgKSArCiAgeGxhYigiIikgKwogIHlsYWIoIlNwZWVjaCBJbnRlbGxpZ2liaWxpdHkiKSArCiAgZ2d0aXRsZSgiU3BlZWNoIEludGVsbGlnaWJpbGl0eSIpICsKICB5bGltKGMoMCwxMDApKQpwbG90X0ludAoKc2NhdHRlciA8LSBnZ3Bsb3QocGxvdERhdGFfSW50LAogICAgICAgICAgICAgICAgICBhZXMoeCA9IHRyYW5zQWNjLAogICAgICAgICAgICAgICAgIHkgPSBWQVMpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBFdGlvbG9neSkpICsKICAjZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSkgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLDEwMCksIHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvPTEpCnNjYXR0ZXIKYGBgCiMjIE1vZGVsIFNjYXR0ZXJwbG90CgpgYGB7cn0KbW9kZWxGaWd1cmVEYXRhIDwtIEFjb3VzdGljRGF0YSAlPiUKICBkcGx5cjo6ZmlsdGVyKCFncmVwbCgiX3JlbCIsU3BlYWtlcikpICU+JQogIGRwbHlyOjpzZWxlY3QoU3BlYWtlciwgRXRpb2xvZ3ksIFNleCwgVlNBX2IsIHZvd2VsX0VEX2IsIEh1bGxfYiwgSHVsbF9iVlNEXzI1LCBIdWxsX2JWU0RfNzUsIFZBUywgdHJhbnNBY2MpICU+JQogIGRwbHlyOjptdXRhdGUoU3BlYWtlciA9IGFzLmZhY3RvcihTcGVha2VyKSwKICAgICAgICAgICAgICAgIEV0aW9sb2d5ID0gYXMuZmFjdG9yKEV0aW9sb2d5KSwKICAgICAgICAgICAgICAgIFNleCA9IGFzLmZhY3RvcihTZXgpKSAlPiUKICB0aWR5cjo6cGl2b3RfbG9uZ2VyKGNvbHMgPSBWQVM6dHJhbnNBY2MsIG5hbWVzX3RvID0gIkludFR5cGUiLCB2YWx1ZXNfdG8gPSAiSW50IikgJT4lCiAgZHBseXI6Om11dGF0ZShJbnRUeXBlID0gY2FzZV93aGVuKAogICAgSW50VHlwZSA9PSAidHJhbnNBY2MiIH4gIk9UIiwKICAgIFRSVUUgfiAiVkFTIgogICksCiAgICAgICAgICAgICAgICBJbnRUeXBlID0gYXMuZmFjdG9yKEludFR5cGUpKQoKeWxhYmVsIDwtICJJbnRlbGxpZ2liaWxpdHkiCm15UGFsIDwtIGMoIiMyRDJEMzciLCAiIzEyNzlCNSIpCm15UGFsU2hhcGUgPC0gYygxOSwgMSkKClZTQSA8LSBtb2RlbEZpZ3VyZURhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gVlNBX2IsCiAgICAgIHkgPSBJbnQsCiAgICAgIGNvbG9yID0gSW50VHlwZSwKICAgICAgc2hhcGUgPSBJbnRUeXBlLAogICAgICBsaW5ldHlwZSA9IEludFR5cGUpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVCwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVlNBIChCYXJrIl4yKiIpIikpICsKICB5bGFiKHlsYWJlbCkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEwMCkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIGFzcGVjdC5yYXRpbz0xKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IG15UGFsKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IG15UGFsU2hhcGUpICsKICBsYWJzKGNvbG9yPSJJbnRlbGxpZ2liaWxpdHkgVHlwZSIsCiAgICAgICBzaGFwZSA9ICJJbnRlbGxpZ2liaWxpdHkgVHlwZSIsCiAgICAgICBsaW5ldHlwZSA9ICJJbnRlbGxpZ2liaWxpdHkgVHlwZSIpCgpkaXNwIDwtIG1vZGVsRmlndXJlRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB2b3dlbF9FRF9iLAogICAgICB5ID0gSW50LAogICAgICBjb2xvciA9IEludFR5cGUsCiAgICAgIHNoYXBlID0gSW50VHlwZSwKICAgICAgbGluZXR5cGUgPSBJbnRUeXBlKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFQsIGZpbGwgPSAibGlnaHQgZ3JleSIpICsKICB4bGFiKCJDb3JuZXIgRGlzcGVyc2lvbiAoQmFyaykiKSArCiAgeWxhYih5bGFiZWwpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBteVBhbCkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBteVBhbFNoYXBlKSArCiAgbGFicyhjb2xvcj0iSW50ZWxsaWdpYmlsaXR5IFR5cGUiLAogICAgICAgc2hhcGUgPSAiSW50ZWxsaWdpYmlsaXR5IFR5cGUiLAogICAgICAgbGluZXR5cGUgPSAiSW50ZWxsaWdpYmlsaXR5IFR5cGUiKQoKSHVsbCA8LSBtb2RlbEZpZ3VyZURhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iLAogICAgICB5ID0gSW50LAogICAgICBjb2xvciA9IEludFR5cGUsCiAgICAgIHNoYXBlID0gSW50VHlwZSwKICAgICAgbGluZXR5cGUgPSBJbnRUeXBlKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFQsIGZpbGwgPSAibGlnaHQgZ3JleSIpICsKICB4bGFiKGV4cHJlc3Npb24oIlZTQSJbSHVsbF0qIiAoQmFyayJeMioiKSIpKSArCiAgeWxhYih5bGFiZWwpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbXlQYWwpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gbXlQYWxTaGFwZSkgKwogIGxhYnMoY29sb3I9IkludGVsbGlnaWJpbGl0eSBUeXBlIiwKICAgICAgIHNoYXBlID0gIkludGVsbGlnaWJpbGl0eSBUeXBlIiwKICAgICAgIGxpbmV0eXBlID0gIkludGVsbGlnaWJpbGl0eSBUeXBlIikKCnZzZDI1IDwtIG1vZGVsRmlndXJlRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfMjUsCiAgICAgIHkgPSBJbnQsCiAgICAgIGNvbG9yID0gSW50VHlwZSwKICAgICAgc2hhcGUgPSBJbnRUeXBlLAogICAgICBsaW5ldHlwZSA9IEludFR5cGUpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVCwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVlNEIlsyNV0qIiAoQmFyayJeMioiKSIpKSArCiAgeWxhYih5bGFiZWwpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbXlQYWwpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gbXlQYWxTaGFwZSkgKwogIGxhYnMoY29sb3I9IkludGVsbGlnaWJpbGl0eSBUeXBlIiwKICAgICAgIHNoYXBlID0gIkludGVsbGlnaWJpbGl0eSBUeXBlIiwKICAgICAgIGxpbmV0eXBlID0gIkludGVsbGlnaWJpbGl0eSBUeXBlIikKCnZzZDc1IDwtIG1vZGVsRmlndXJlRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfNzUsCiAgICAgIHkgPSBJbnQsCiAgICAgIGNvbG9yID0gSW50VHlwZSwKICAgICAgc2hhcGUgPSBJbnRUeXBlLAogICAgICBsaW5ldHlwZSA9IEludFR5cGUpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVCwgZmlsbCA9ICJsaWdodCBncmV5IikgKwogIHhsYWIoZXhwcmVzc2lvbigiVlNEIls3NV0qIiAoQmFyayJeMioiKSIpKSArCiAgeWxhYih5bGFiZWwpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShhc3BlY3QucmF0aW89MSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbXlQYWwpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gbXlQYWxTaGFwZSkgKwogIGxhYnMoY29sb3I9IkludGVsbGlnaWJpbGl0eSBUeXBlIiwKICAgICAgIHNoYXBlID0gIkludGVsbGlnaWJpbGl0eSBUeXBlIiwKICAgICAgIGxpbmV0eXBlID0gIkludGVsbGlnaWJpbGl0eSBUeXBlIikKCiMgQ3JlYXRpbmcgT1QgU2NhdHRlcnBsb3QgRmlndXJlCgpzY2F0dGVyIDwtIFZTQSArIGRpc3AgKyBwYXRjaHdvcms6Omd1aWRlX2FyZWEoKSArIEh1bGwgKyB2c2QyNSArIHZzZDc1ICsKICBwYXRjaHdvcms6OnBsb3RfbGF5b3V0KGd1aWRlcyA9ICdjb2xsZWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAzKQpzY2F0dGVyIAoKZ2dzYXZlKCJQbG90cy9Nb2RlbEZpZ3VyZS5wbmciLCBzY2F0dGVyLAogICAgICAgaGVpZ2h0ID0gNCwKICAgICAgIHdpZHRoID0gNiwKICAgICAgIHVuaXRzID0gImluIiwKICAgICAgIHNjYWxlID0gMS4xKQpgYGAKCiMgQWx0ZXJuYXRlIEFuYWx5c2lzCgpJbiB0aGlzIGFsdGVybmF0ZSBhbmFseXNpcywgd2UgYXJlIGxvb2tpbmcgYXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZXNlIGFjb3VzdGljIG1lYXN1cmVzIHdpdGggc3BlZWNoIGludGVsbGlnaWJpbGl0eSBmb3IgdGhlIEFMUy9QRCBhbmQgdGhlIEhEL0F0YXhpYyBzcGVha2VycyBzZXBhcmF0ZWx5LiBXZSBjcmVhdGUgYSBuZXcgdmFyaWFibGUgY2FsbGVkIEluY29vcmQsIHdoZXJlIHRoZSBBTFMvUEQgU3BlYWtlcnMgYXJlIHNldCBhcyB0aGUgcmVmZXJlbmNlIGdyb3VwIChpbiBvcmRlciB0byBjb21wYXJlIHRvIHRoZSBBdGF4aWMvSEQgU3BlYWtlciBHcm91cCkuIEdyb3VwIENvbXBhcmlzb25zLCBhZGRpdGlvbmFsIGRhdGEgdmlzdWFsaXphdGlvbnMsIGFuZCBmdXJ0aGVyIGxpbmVhciBtb2RlbCBjb21wYXJpc29ucyBhcmUgY29tcGxldGVkLgoKIyMgRGF0YSBQcmVwCgpgYGB7cn0KCiMgQ3JlYXRpbmcgYSBuZXcgdmFyaWFibGUgaW4gQWNvdXN0aWNEYXRhLiBJbmNvb3JkIGlzIGEgZHVtbXkgdmFyaWFibGUuIEFMUy9QRCBTcGVha2VycyA9IDAsIEhEL0F0YXhpYyA9IDEKCkFjb3VzdGljRGF0YSA8LSBBY291c3RpY0RhdGEgJT4lCiAgZHBseXI6Om11dGF0ZShJbmNvb3JkID0gY2FzZV93aGVuKEV0aW9sb2d5ID09ICJIRCIgfiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdGlvbG9neSA9PSAiQXRheGljIiB+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAwKSkgJT4lCiAgZHBseXI6Om11dGF0ZShJbmNvb3JkID0gYXMuZmFjdG9yKEluY29vcmQpKQoKYGBgCgojIyBEZXNjcmlwdGl2ZXMgCgpgYGB7cn0KCkRlc2NyaXB0aXZlc19BTFMuUERfaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZHBseXI6Omdyb3VwX2J5KEluY29vcmQpICU+JQogIGRwbHlyOjpzdW1tYXJpemUoVlNBX21lYW4gPSBtZWFuKFZTQV9iLCBuYS5ybSA9VCksIFZTQV9zZCA9IHNkKFZTQV9iLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgICAgRGlzcF9tZWFuID0gbWVhbih2b3dlbF9FRF9iLCBuYS5ybSA9VCksIERpc3Bfc2QgPSBzZCh2b3dlbF9FRF9iLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBIdWxsX21lYW4gPSBtZWFuKEh1bGxfYiwgbmEucm0gPVQpLCBIdWxsX3NkID0gc2QoSHVsbF9iLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWU0QyNV9tZWFuID0gbWVhbihIdWxsX2JWU0RfMjUsIG5hLnJtID1UKSwgVlNEMjVfc2QgPSBzZChIdWxsX2JWU0RfMjUsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZTRDUwX21lYW4gPSBtZWFuKEh1bGxfYlZTRF81MCwgbmEucm0gPVQpLCBWU0Q1MF9zZCA9IHNkKEh1bGxfYlZTRF81MCwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVlNENzVfbWVhbiA9IG1lYW4oSHVsbF9iVlNEXzc1LCBuYS5ybSA9VCksIFZTRDc1X3NkID0gc2QoSHVsbF9iVlNEXzc1LCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWQVNfbWVhbiA9IG1lYW4oVkFTLCBuYS5ybSA9VCksIFZBU19zZCA9IHNkKFZBUywgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgT1RfbWVhbiA9IG1lYW4odHJhbnNBY2MsIG5hLnJtID1UKSwgT1Rfc2QgPSBzZCh0cmFuc0FjYywgbmEucm0gPVQpKQoKRGVzY3JpcHRpdmVzX0FMUy5QRF9pbmNvb3JkCgpgYGAKCiMjIERhdGEgVmlzCgojIyMgR3JvdXAgQ29tcGFyaXNvbiBSaWRnZWxpbmUgUGxvdHMKCmBgYHtyfQoKIyBWU0EgUmlkZ2VsaW5lIFBsb3QgYnkgSW5jb29yZGluYXRpb24gKEluY29vcmQgPSAwIGFyZSBBTFMvUEQgU3BlYWtlcnMsIEluY29vcmQgPT0gMSBhcmUgSEQvQXRheGljIFNwZWFrZXJzKQoKVlNBX2luY29vcmQucGxvdCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gVlNBX2IsCiAgICAgIHkgPSBJbmNvb3JkLAogICAgICBjb2xvciA9IEluY29vcmQsCiAgICAgIGZpbGwgPSBJbmNvb3JkKSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhqaXR0ZXJlZF9wb2ludHMgPSBULCAKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcih3aWR0aCA9IDAuMDEsIGhlaWdodCA9IDApLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NoYXBlID0gJ3wnLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSA1LAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAxLAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjcsCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IC43KSArCiAgeGxhYigiVm93ZWwgU3BhY2UgQXJlYSAoQmFyaykiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIENvcm5lciBEaXNwZXJzaW9uIFJpZGdlbGluZSBQbG90IGJ5IEluY29vcmRpbmF0aW9uIChJbmNvb3JkID0gMCBhcmUgQUxTL1BEIFNwZWFrZXJzLCBJbmNvb3JkID09IDEgYXJlIEhEL0F0YXhpYyBTcGVha2VycykKCmRpc3BfaW5jb29yZC5wbG90IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB2b3dlbF9FRF9iLAogICAgICB5ID0gSW5jb29yZCwKICAgICAgY29sb3IgPSBJbmNvb3JkLAogICAgICBmaWxsID0gSW5jb29yZCkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIkNvcm5lciBEaXNwZXJzaW9uIChCYXJrKSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgSHVsbCBSaWRnZWxpbmUgUGxvdCBieSBJbmNvb3JkaW5hdGlvbiAoSW5jb29yZCA9IDAgYXJlIEFMUy9QRCBTcGVha2VycywgSW5jb29yZCA9PSAxIGFyZSBIRC9BdGF4aWMgU3BlYWtlcnMpCgpodWxsX2luY29vcmQucGxvdCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iLAogICAgICB5ID0gSW5jb29yZCwKICAgICAgY29sb3IgPSBJbmNvb3JkLAogICAgICBmaWxsID0gSW5jb29yZCkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIlZvd2VsIFNwYWNlIEh1bGwgKEJhcmspIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyBWU0QgMjUgUmlkZ2VsaW5lIFBsb3QgYnkgSW5jb29yZGluYXRpb24gKEluY29vcmQgPSAwIGFyZSBBTFMvUEQgU3BlYWtlcnMsIEluY29vcmQgPT0gMSBhcmUgSEQvQXRheGljIFNwZWFrZXJzKQoKdnNkMjVfaW5jb29yZC5wbG90IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfMjUsCiAgICAgIHkgPSBJbmNvb3JkLAogICAgICBjb2xvciA9IEluY29vcmQsCiAgICAgIGZpbGwgPSBJbmNvb3JkKSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhqaXR0ZXJlZF9wb2ludHMgPSBULCAKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcih3aWR0aCA9IDAuMDEsIGhlaWdodCA9IDApLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NoYXBlID0gJ3wnLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSA1LAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAxLAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjcsCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IC43KSArCiAgeGxhYigiVm93ZWwgU3BhY2UgRGVzbml0eSAyNSAoQmFyaykiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIFZTRCA1MCBSaWRnZWxpbmUgUGxvdCBieSBJbmNvb3JkaW5hdGlvbiAoSW5jb29yZCA9IDAgYXJlIEFMUy9QRCBTcGVha2VycywgSW5jb29yZCA9PSAxIGFyZSBIRC9BdGF4aWMgU3BlYWtlcnMpCgp2c2Q1MF9pbmNvb3JkLnBsb3QgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IEh1bGxfYlZTRF81MCwKICAgICAgeSA9IEluY29vcmQsCiAgICAgIGNvbG9yID0gSW5jb29yZCwKICAgICAgZmlsbCA9IEluY29vcmQpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGppdHRlcmVkX3BvaW50cyA9IFQsIAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKHdpZHRoID0gMC4wMSwgaGVpZ2h0ID0gMCksIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2hhcGUgPSAnfCcsIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDUsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNywKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gLjcpICsKICB4bGFiKCJWb3dlbCBTcGFjZSBEZXNuaXR5IDUwIChCYXJrKSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgVlNEIDc1IFJpZGdlbGluZSBQbG90IGJ5IEluY29vcmRpbmF0aW9uIChJbmNvb3JkID0gMCBhcmUgQUxTL1BEIFNwZWFrZXJzLCBJbmNvb3JkID09IDEgYXJlIEhEL0F0YXhpYyBTcGVha2VycykKCnZzZDc1X2luY29vcmQucGxvdCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iVlNEXzc1LAogICAgICB5ID0gSW5jb29yZCwKICAgICAgY29sb3IgPSBJbmNvb3JkLAogICAgICBmaWxsID0gSW5jb29yZCkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIlZvd2VsIFNwYWNlIERlc25pdHkgNzUgKEJhcmspIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyBPcnRob2dyYXBoaWMgVHJhbnNjcmlwdGlvbiBSaWRnZWxpbmUgUGxvdCBieSBJbmNvb3JkaW5hdGlvbiAoSW5jb29yZCA9IDAgYXJlIEFMUy9QRCBTcGVha2VycywgSW5jb29yZCA9PSAxIGFyZSBIRC9BdGF4aWMgU3BlYWtlcnMpCgpPVF9pbmNvb3JkLnBsb3QgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IHRyYW5zQWNjLAogICAgICB5ID0gSW5jb29yZCwKICAgICAgY29sb3IgPSBJbmNvb3JkLAogICAgICBmaWxsID0gSW5jb29yZCkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgVmlzdWFsIEFuYWxvZyBTY2FsZSBJbnRlbGxpZ2liaWxpdHkgUmF0aW5nIFJpZGdlbGluZSBQbG90IGJ5IEluY29vcmRpbmF0aW9uIChJbmNvb3JkID0gMCBhcmUgQUxTL1BEIFNwZWFrZXJzLCBJbmNvb3JkID09IDEgYXJlIEhEL0F0YXhpYyBTcGVha2VycykKClZBU19pbmNvb3JkLnBsb3QgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IFZBUywKICAgICAgeSA9IEluY29vcmQsCiAgICAgIGNvbG9yID0gSW5jb29yZCwKICAgICAgZmlsbCA9IEluY29vcmQpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGppdHRlcmVkX3BvaW50cyA9IFQsIAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKHdpZHRoID0gMC4wMSwgaGVpZ2h0ID0gMCksIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2hhcGUgPSAnfCcsIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDUsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNywKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gLjcpICsKICB4bGFiKCJSYXRpZ25zIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyBDcmVhdGluZyBEaXN0cmlidXRpb25zIGJ5IEluY29vcmQgRmlndXJlCgpEaXN0cmlidXRpb25zX2luY29vcmQgPC0gZ2dwdWJyOjpnZ2FycmFuZ2UoVlNBX2luY29vcmQucGxvdCwgZGlzcF9pbmNvb3JkLnBsb3QsIGh1bGxfaW5jb29yZC5wbG90LCB2c2QyNV9pbmNvb3JkLnBsb3QsIHZzZDUwX2luY29vcmQucGxvdCwgdnNkNzVfaW5jb29yZC5wbG90LCBPVF9pbmNvb3JkLnBsb3QsIFZBU19pbmNvb3JkLnBsb3QsCiAgICAgICAgICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgICAgICAgICBucm93ID0gNCkKCiMgU2F2aW5nIERpc3RyaWJ1dGlvbiBGaWd1cmUKCmdnc2F2ZSgiUGxvdHMvRGlzdHJpYnV0aW9uX2luY29vcmQucG5nIiwgcGxvdCA9IGxhc3RfcGxvdCgpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMCwgdW5pdCA9ICJpbiIpCgpgYGAKCiMjIyBTY2F0dGVycGxvdHMKCmBgYHtyfQoKIyBPVCBTY2F0dGVycGxvdHMgYnkgSW5jb29yZAoKT1RfVlNBLmluY29vcmQgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IFZTQV9iLAogICAgICB5ID0gdHJhbnNBY2MsCiAgICAgIGNvbG9yID0gSW5jb29yZCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGKSArCiAgeGxhYigiVm93ZWwgU3BhY2UgQXJlYSAoQmFyaykiKSArCiAgeWxhYigiUGVyY2VudCBXb3JkcyBDb3JyZWN0IikgKwogIGdndGl0bGUoIk9ydGhvZ3JhcGhpYyBUcmFuc2NyaXB0aW9uIikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEwMCkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIpKQoKT1RfZGlzcC5pbmNvb3JkIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB2b3dlbF9FRF9iLAogICAgICB5ID0gdHJhbnNBY2MsCiAgICAgIGNvbG9yID0gSW5jb29yZCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGKSArCiAgeGxhYigiQ29ybmVyIERpc3BlcnNpb24gKEJhcmspIikgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgpPVF9IdWxsLmluY29vcmQgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IEh1bGxfYiwKICAgICAgeSA9IHRyYW5zQWNjLAogICAgICBjb2xvciA9IEluY29vcmQpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIHhsYWIoIlZvd2VsIFNwYWNlIEh1bGwgKEJhcmspIikgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgpPVF92c2QyNS5pbmNvb3JkIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfMjUsCiAgICAgIHkgPSB0cmFuc0FjYywKICAgICAgY29sb3IgPSBJbmNvb3JkKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEYpICsKICB4bGFiKCJWb3dlbCBTcGFjZSBEZW5zaXR5IDI1IChCYXJrKSIpICsKICB5bGFiKCJQZXJjZW50IFdvcmRzIENvcnJlY3QiKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKQoKT1RfdnNkNzUuaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iVlNEXzc1LAogICAgICB5ID0gdHJhbnNBY2MsCiAgICAgIGNvbG9yID0gSW5jb29yZCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGKSArCiAgeGxhYigiVm93ZWwgU3BhY2UgRGVuc2l0eSA3NSAoQmFyaykiKSArCiAgeWxhYigiUGVyY2VudCBXb3JkcyBDb3JyZWN0IikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEwMCkpICsKICB0aGVtZV9jbGFzc2ljKCkKCgojIFZBUyBTY2F0dGVycGxvdHMKClZBU19WU0EuaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gVlNBX2IsCiAgICAgIHkgPSBWQVMsCiAgICAgIGNvbG9yID0gSW5jb29yZCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGKSArCiAgeGxhYigiVm93ZWwgU3BhY2UgQXJlYSAoQmFyaykiKSArCiAgeWxhYigiVkFTIFNjb3JlIikgKwogIGdndGl0bGUoIlZpc3VhbCBBbmFsb2cgU2NhbGUiKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9ICJib2xkIikpCgpWQVNfZGlzcC5pbmNvb3JkIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB2b3dlbF9FRF9iLAogICAgICB5ID0gVkFTLAogICAgICBjb2xvciA9IEluY29vcmQpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIHhsYWIoIkNvcm5lciBEaXNwZXJzaW9uIChCYXJrKSIpICsKICB5bGFiKCJWQVMgU2NvcmUiKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKQoKVkFTX0h1bGwuaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iLAogICAgICB5ID0gVkFTLAogICAgICBjb2xvciA9IEluY29vcmQpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIHhsYWIoIlZvd2VsIFNwYWNlIEh1bGwgKEJhcmspIikgKwogIHlsYWIoIlZBUyBTY29yZSIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgpWQVNfdnNkMjUuaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iVlNEXzI1LAogICAgICB5ID0gVkFTLAogICAgICBjb2xvciA9IEluY29vcmQpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIHhsYWIoIlZvd2VsIFNwYWNlIERlbnNpdHkgMjUgKEJhcmspIikgKwogIHlsYWIoIlZBUyBTY29yZSIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgpWQVNfdnNkNzUuaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iVlNEXzc1LAogICAgICB5ID0gVkFTLAogICAgICBjb2xvciA9IEluY29vcmQpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIHhsYWIoIlZvd2VsIFNwYWNlIERlbnNpdHkgNzUgKEJhcmspIikgKwogIHlsYWIoIlZBUyBTY29yZSIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgoKIyBDcmVhdGluZyBTY2F0dGVycGxvdCBGaWd1cmUKClNjYXR0ZXJwbG90c19pbmNvb3JkIDwtIGdncHVicjo6Z2dhcnJhbmdlKE9UX1ZTQS5pbmNvb3JkLCBWQVNfVlNBLmluY29vcmQsIE9UX2Rpc3AuaW5jb29yZCwgVkFTX2Rpc3AuaW5jb29yZCwgT1RfSHVsbC5pbmNvb3JkLCBWQVNfSHVsbC5pbmNvb3JkLCBPVF92c2QyNS5pbmNvb3JkLCBWQVNfdnNkMjUuaW5jb29yZCwgT1RfdnNkNzUuaW5jb29yZCwgVkFTX3ZzZDc1LmluY29vcmQsCiAgICAgICAgICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgICAgICAgICBucm93ID0gNSkKCiMjIFNhdmluZyBTY2F0dGVycGxvdCBGaWd1cmUKCmdnc2F2ZSgiUGxvdHMvU2NhdHRlcnBsb3RzX2luY29vcmQucG5nIiwgcGxvdCA9IGxhc3RfcGxvdCgpLCB3aWR0aCA9IDE1LCBoZWlnaHQgPSAyMCwgdW5pdCA9ICJpbiIsIHNjYWxlID0gLjUpCgoKYGBgCgoKIyMgR3JvdXAgQ29tcGFyaXNvbnMKCiMjIyBUd28gRGF0YWZyYW1lcyBmb3IgSW5jb29yZCBHcm91cHMKCmBgYHtyfQoKY29vcmQuZ3JvdXAgPC0gQWNvdXN0aWNEYXRhICU+JQogIGRwbHlyOjpmaWx0ZXIoSW5jb29yZCA9PSAwKQoKaW5jb29yZC5ncm91cCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZHBseXI6OmZpbHRlcihJbmNvb3JkID09IDEpCgpgYGAKCgojIyMgVlNBCgpgYGB7cn0KCiMgQXNzdW1wdGlvbiBDaGVjawoKIyMgQ2hlY2tpbmcgTm9ybWFsaXR5Cgp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KFZTQV9iW0luY29vcmQgPT0gMF0pKQp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KFZTQV9iW0luY29vcmQgPT0gMV0pKQoKIyMgRXF1YWwgVmFyaWFuY2UgQ2hlY2sKCnJlcy5mdGVzdC5WU0EgPC0gdmFyLnRlc3QoVlNBX2IgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpyZXMuZnRlc3QuVlNBCgojIE1vZGVsIFJlc3VsdHMKClZTQV9iX3QgPC0gdC50ZXN0KGluY29vcmQuZ3JvdXAkVlNBX2IsIGNvb3JkLmdyb3VwJFZTQV9iLCB2YXIuZXF1YWwgPSBUKQpWU0FfYl90CgpgYGAKCiMjIyBDb3JuZXIgRGlzcGVyc2lvbgoKYGBge3J9CgojIEFzc3VtcHRpb24gQ2hlY2sKCiMjIENoZWNraW5nIE5vcm1hbGl0eQoKd2l0aChBY291c3RpY0RhdGEsIHNoYXBpcm8udGVzdCh2b3dlbF9FRF9iW0luY29vcmQgPT0gMF0pKQp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KHZvd2VsX0VEX2JbSW5jb29yZCA9PSAxXSkpCgojIyBFcXVhbCBWYXJpYW5jZSBDaGVjawoKcmVzLmZ0ZXN0LmRpc3AgPC0gdmFyLnRlc3Qodm93ZWxfRURfYiB+IEluY29vcmQsIGRhdGEgPSBBY291c3RpY0RhdGEpCnJlcy5mdGVzdC5kaXNwCgojIE1vZGVsIFJlc3VsdHMKCmRpc3BfdCA8LSB0LnRlc3QoaW5jb29yZC5ncm91cCR2b3dlbF9FRF9iLCBjb29yZC5ncm91cCR2b3dlbF9FRF9iLCB2YXIuZXF1YWwgPSBUKQpkaXNwX3QKCmBgYAoKIyMjIEh1bGwKCmBgYHtyfQoKIyBBc3N1bXB0aW9uIENoZWNrCgojIyBDaGVja2luZyBOb3JtYWxpdHkKCndpdGgoQWNvdXN0aWNEYXRhLCBzaGFwaXJvLnRlc3QoSHVsbF9iW0luY29vcmQgPT0gMF0pKQp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KEh1bGxfYltJbmNvb3JkID09IDFdKSkKCiMjIEVxdWFsIFZhcmlhbmNlIENoZWNrCgpyZXMuZnRlc3QuaHVsbCA8LSB2YXIudGVzdChIdWxsX2IgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpyZXMuZnRlc3QuaHVsbAoKIyBNb2RlbCBSZXN1bHRzCgpodWxsX3QgPC0gdC50ZXN0KGluY29vcmQuZ3JvdXAkSHVsbF9iLCBjb29yZC5ncm91cCRIdWxsX2IsIHZhci5lcXVhbCA9IFQpCmh1bGxfdAoKYGBgCgojIyMgVlNEIDI1CgpgYGB7cn0KCiMgQXNzdW1wdGlvbiBDaGVjawoKIyMgQ2hlY2tpbmcgTm9ybWFsaXR5Cgp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KEh1bGxfYlZTRF8yNVtJbmNvb3JkID09IDBdKSkKd2l0aChBY291c3RpY0RhdGEsIHNoYXBpcm8udGVzdChIdWxsX2JWU0RfMjVbSW5jb29yZCA9PSAxXSkpCgojIyBFcXVhbCBWYXJpYW5jZSBDaGVjawoKcmVzLmZ0ZXN0LnZzZDI1IDwtIHZhci50ZXN0KEh1bGxfYlZTRF8yNSB+IEluY29vcmQsIGRhdGEgPSBBY291c3RpY0RhdGEpCnJlcy5mdGVzdC52c2QyNQoKIyBNb2RlbCBSZXN1bHRzCgp2c2QyNV90IDwtIHQudGVzdChpbmNvb3JkLmdyb3VwJEh1bGxfYlZTRF8yNSwgY29vcmQuZ3JvdXAkSHVsbF9iVlNEXzI1LCB2YXIuZXF1YWwgPSBUKQp2c2QyNV90CgpgYGAKCiMjIyBWU0QgNTAKCmBgYHtyfQoKIyBBc3N1bXB0aW9uIENoZWNrCgojIyBDaGVja2luZyBOb3JtYWxpdHkKCndpdGgoQWNvdXN0aWNEYXRhLCBzaGFwaXJvLnRlc3QoSHVsbF9iVlNEXzUwW0luY29vcmQgPT0gMF0pKQp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KEh1bGxfYlZTRF81MFtJbmNvb3JkID09IDFdKSkKCiMjIEVxdWFsIFZhcmlhbmNlIENoZWNrCgpyZXMuZnRlc3QudnNkNTAgPC0gdmFyLnRlc3QoSHVsbF9iVlNEXzUwIH4gSW5jb29yZCwgZGF0YSA9IEFjb3VzdGljRGF0YSkKcmVzLmZ0ZXN0LnZzZDUwCgojIE1vZGVsIFJlc3VsdHMgKE1hbm4tV2hpdG5leSBVIHRlc3QgY29uZHVjdGVkIHNpbmNlIGFzc3VtcHRpb24gb2Ygbm9ybWFsaXR5IGlzIHZpb2xhdGVkKQoKdnNkNTBfTVcgPC0gd2lsY294LnRlc3QoSHVsbF9iVlNEXzUwIH4gSW5jb29yZCwgZGF0YSA9IEFjb3VzdGljRGF0YSkKdnNkNTBfTVcKCmBgYAoKIyMjIFZTRCA3NQoKYGBge3J9CgojIEFzc3VtcHRpb24gQ2hlY2sKCiMjIENoZWNraW5nIE5vcm1hbGl0eQoKd2l0aChBY291c3RpY0RhdGEsIHNoYXBpcm8udGVzdChIdWxsX2JWU0RfNzVbSW5jb29yZCA9PSAwXSkpCndpdGgoQWNvdXN0aWNEYXRhLCBzaGFwaXJvLnRlc3QoSHVsbF9iVlNEXzc1W0luY29vcmQgPT0gMV0pKQoKIyMgRXF1YWwgVmFyaWFuY2UgQ2hlY2sKCnJlcy5mdGVzdC52c2Q3NSA8LSB2YXIudGVzdChIdWxsX2JWU0RfNzUgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpyZXMuZnRlc3QudnNkNzUKCiMgTW9kZWwgUmVzdWx0cyAoTWFubi1XaGl0bmV5IFUgdGVzdCBjb25kdWN0ZWQgc2luY2UgYXNzdW1wdGlvbiBvZiBub3JtYWxpdHkgaXMgdmlvbGF0ZWQpCgp2c2Q3NV9NVyA8LSB3aWxjb3gudGVzdChIdWxsX2JWU0RfNzUgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQp2c2Q3NV9NVwoKCmBgYAoKIyMjIE9ydGhvZ3JhcGhpYyBUcmFuc2NyaXB0aW9uIFNjb3JlcwoKYGBge3J9CgojIEFzc3VtcHRpb24gQ2hlY2sKCiMjIENoZWNraW5nIE5vcm1hbGl0eQoKd2l0aChBY291c3RpY0RhdGEsIHNoYXBpcm8udGVzdCh0cmFuc0FjY1tJbmNvb3JkID09IDBdKSkKd2l0aChBY291c3RpY0RhdGEsIHNoYXBpcm8udGVzdCh0cmFuc0FjY1tJbmNvb3JkID09IDFdKSkKCiMjIEVxdWFsIFZhcmlhbmNlIENoZWNrCgpyZXMuZnRlc3QuT1QgPC0gdmFyLnRlc3QodHJhbnNBY2MgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpyZXMuZnRlc3QuT1QKCiMgTW9kZWwgUmVzdWx0cyAoTWFubi1XaGl0bmV5IFUgdGVzdCBjb25kdWN0ZWQgc2luY2UgYXNzdW1wdGlvbiBvZiBub3JtYWxpdHkgaXMgdmlvbGF0ZWQpCgpPVF9NVyA8LSB3aWxjb3gudGVzdCh0cmFuc0FjYyB+IEluY29vcmQsIGRhdGEgPSBBY291c3RpY0RhdGEpCk9UX01XCgpgYGAKCiMjIyBWQVMKCmBgYHtyfQoKIyBBc3N1bXB0aW9uIENoZWNrCgojIyBDaGVja2luZyBOb3JtYWxpdHkKCndpdGgoQWNvdXN0aWNEYXRhLCBzaGFwaXJvLnRlc3QoVkFTW0luY29vcmQgPT0gMF0pKQp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KFZBU1tJbmNvb3JkID09IDFdKSkKCiMjIEVxdWFsIFZhcmlhbmNlIENoZWNrCgpyZXMuZnRlc3QuVkFTIDwtIHZhci50ZXN0KFZBUyB+IEluY29vcmQsIGRhdGEgPSBBY291c3RpY0RhdGEpCnJlcy5mdGVzdC5WQVMKCiMgTW9kZWwgUmVzdWx0cyAoTWFubi1XaGl0bmV5IFUgdGVzdCBjb25kdWN0ZWQgc2luY2UgYXNzdW1wdGlvbiBvZiBub3JtYWxpdHkgaXMgdmlvbGF0ZWQpCgpPVF9NVyA8LSB3aWxjb3gudGVzdChWQVMgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpPVF9NVwoKYGBgCgojIyBPVCBBbmFseXNpcwoKU2luY2Ugd2UgZm91bmQgc2lnbmlmaWNhbnQgZ3JvdXAgZGlmZmVyZW5jZXMgZm9yIHNvbWUgYWNvdXN0aWMgbWVhc3VyZXMgYmV0d2VlbiB0aGUgQUxTL1BEIGFuZCBBdGF4aWMvSEQgZ3JvdXBzLCB3ZSBjb250aW51ZWQgdGhlIGhlaXJhcmljaGFsIHJlZ3Jlc3Npb24gYXBwcm9hY2ggZnJvbSBPVCBNb2RlbCA1LiBBZGRpbmcgaW4gdGhlIEluY29vcmQgcHJlZGljdG9yIGFsb25nIHdpdGggdGhlIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZSBhY291c3RpYyBtZWFzdXJlcyBkaWQgbm90IHNpZ25pZmljYW50bHkgaW1wcm92ZSBtb2RlbCBmaXQuIFNvIG91ciBvcmlnaW5hbCBmaW5hbCBPVCBtb2RlbCBpcyByZXRhaW5lZC4KCiMjIyBNb2RlbCA2CgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgNgoKT1RfTW9kZWw2IDwtIGxtKHRyYW5zQWNjIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iICsgSW5jb29yZCwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDYgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsNikKCiMjIE1vZGVsIDYgU3VtbWFyeQoKc3VtbWFyeShPVF9Nb2RlbDYpCgojIyBNb2RlbCA1IGFuZCBNb2RlbCA2IENvbXBhcmlzb24KCmFub3ZhKE9UX01vZGVsNSwgT1RfTW9kZWw2KQoKYGBgCiMjIyBNb2RlbCA3CgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgNwoKT1RfTW9kZWw3IDwtIGxtKHRyYW5zQWNjIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iICsgCiAgICAgICAgICAgICAgICAgIEluY29vcmQgKyBJbmNvb3JkKkh1bGxfYlZTRF8yNSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDcgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsNykKCiMjIE1vZGVsIDcgU3VtbWFyeQoKc3VtbWFyeShPVF9Nb2RlbDcpCgojIyBNb2RlbCA2IGFuZCBNb2RlbCA3IENvbXBhcmlzb24KCmFub3ZhKE9UX01vZGVsNiwgT1RfTW9kZWw3KQoKYGBgCgojIyMgTW9kZWwgOAoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDgKCk9UX01vZGVsOCA8LSBsbSh0cmFuc0FjYyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiArIFZTQV9iICsgdm93ZWxfRURfYiArIAogICAgICAgICAgICAgICAgICBJbmNvb3JkICsgSW5jb29yZCpIdWxsX2JWU0RfMjUgKyBJbmNvb3JkKkh1bGxfYlZTRF83NSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDggQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsOCkKCiMjIE1vZGVsIDggU3VtbWFyeQoKc3VtbWFyeShPVF9Nb2RlbDgpCgojIyBNb2RlbCA3IGFuZCBNb2RlbCA4IENvbXBhcmlzb24KCmFub3ZhKE9UX01vZGVsNywgT1RfTW9kZWw4KQoKYGBgCgojIyMgTW9kZWwgOQoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDkKCk9UX01vZGVsOSA8LSBsbSh0cmFuc0FjYyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiArIFZTQV9iICsgdm93ZWxfRURfYiArIAogICAgICAgICAgICAgICAgICBJbmNvb3JkICsgSW5jb29yZCpIdWxsX2JWU0RfMjUgKyBJbmNvb3JkKkh1bGxfYlZTRF83NSArIEluY29vcmQqSHVsbF9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgOSBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoT1RfTW9kZWw5KQoKIyMgTW9kZWwgOSBTdW1tYXJ5CgpzdW1tYXJ5KE9UX01vZGVsOSkKCiMjIE1vZGVsIDggYW5kIE1vZGVsIDkgQ29tcGFyaXNvbgoKYW5vdmEoT1RfTW9kZWw4LCBPVF9Nb2RlbDkpCgpgYGAKCiMjIyBNb2RlbCAxMAoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDEwCgpPVF9Nb2RlbDEwIDwtIGxtKHRyYW5zQWNjIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iICsgCiAgICAgICAgICAgICAgICAgIEluY29vcmQgKyBJbmNvb3JkKkh1bGxfYlZTRF8yNSArIEluY29vcmQqSHVsbF9iVlNEXzc1ICsgSW5jb29yZCpIdWxsX2IgKyBJbmNvb3JkKlZTQV9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgMTAgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsMTApCgojIyBNb2RlbCAxMCBTdW1tYXJ5CgpzdW1tYXJ5KE9UX01vZGVsMTApCgojIyBNb2RlbCA5IGFuZCBNb2RlbCAxMCBDb21wYXJpc29uCgphbm92YShPVF9Nb2RlbDksIE9UX01vZGVsMTApCgpgYGAKCiMjIyBNb2RlbCAxMQptbwpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgMTEKCk9UX01vZGVsMTEgPC0gbG0odHJhbnNBY2MgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUgKyBIdWxsX2IgKyBWU0FfYiArIHZvd2VsX0VEX2IgKyAKICAgICAgICAgICAgICAgICAgSW5jb29yZCArIEluY29vcmQqSHVsbF9iVlNEXzI1ICsgSW5jb29yZCpIdWxsX2JWU0RfNzUgKyBJbmNvb3JkKkh1bGxfYiArIEluY29vcmQqVlNBX2IgKyBJbmNvb3JkKnZvd2VsX0VEX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCAxMSBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoT1RfTW9kZWwxMSkKCiMjIE1vZGVsIDExIFN1bW1hcnkKCnN1bW1hcnkoT1RfTW9kZWwxMSkKCiMjIE1vZGVsIDEwIGFuZCBNb2RlbCAxMSBDb21wYXJpc29uCgphbm92YShPVF9Nb2RlbDEwLCBPVF9Nb2RlbDExKQoKYGBgCgojIyBWQVMgQW5hbHlzaXMKClNpbmNlIHdlIGZvdW5kIHNpZ25pZmljYW50IGdyb3VwIGRpZmZlcmVuY2VzIGZvciBzb21lIGFjb3VzdGljIG1lYXN1cmVzIGJldHdlZW4gdGhlIEFMUy9QRCBhbmQgQXRheGljL0hEIGdyb3Vwcywgd2UgY29udGludWVkIHRoZSBoaWVyYXJjaGljYWwgcmVncmVzc2lvbiBhcHByb2FjaCBmcm9tIFZBUyBNb2RlbCA1LiBWQVMgTW9kZWwgNiBmaXQgc2lnbmlmaWNhbnRseSBiZXR0ZXIgdGhhbiBWQVMgTW9kZWwgNS4gSG93ZXZlciwgYWRkaW5nIGluIHRoZSBpbnRlcmFjdGlvbnMgYmV0d2VlbiBJbmNvb3JkIGFuZCB0aGUgYWNvdXN0aWMgbWVhc3VyZXMgZGlkIG5vdCBzaWduaWZpY2FudGx5IGltcHJvdmUgbW9kZWwgZml0LgoKIyMjIE1vZGVsIDYKCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCA2CgpWQVNfTW9kZWw2IDwtIGxtKFZBUyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiArIFZTQV9iICsgdm93ZWxfRURfYiArIEluY29vcmQsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCA2IEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfTW9kZWw2KQoKIyMgTW9kZWwgNiBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbDYpCgojIyBNb2RlbCA1IGFuZCBNb2RlbCA2IENvbXBhcmlzb24KCmFub3ZhKFZBU19Nb2RlbDUsIFZBU19Nb2RlbDYpCgoKYGBgCgojIyMgTW9kZWwgNwoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDcKClZBU19Nb2RlbDcgPC0gbG0oVkFTIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iICsgCiAgICAgICAgICAgICAgICAgIEluY29vcmQgKyBJbmNvb3JkKkh1bGxfYlZTRF8yNSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDcgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU19Nb2RlbDcpCgojIyBNb2RlbCA3IFN1bW1hcnkKCnN1bW1hcnkoVkFTX01vZGVsNykKCiMjIE1vZGVsIDYgYW5kIE1vZGVsIDcgQ29tcGFyaXNvbgoKYW5vdmEoVkFTX01vZGVsNiwgVkFTX01vZGVsNykKCgpgYGAKCiMjIyBNb2RlbCA4CgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgOAoKVkFTX01vZGVsOCA8LSBsbShWQVMgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUgKyBIdWxsX2IgKyBWU0FfYiArIHZvd2VsX0VEX2IgKyAKICAgICAgICAgICAgICAgICAgSW5jb29yZCArIEluY29vcmQqSHVsbF9iVlNEXzI1ICsgSW5jb29yZCpIdWxsX2JWU0RfNzUsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCA4IEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfTW9kZWw4KQoKIyMgTW9kZWwgOCBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbDgpCgojIyBNb2RlbCA3IGFuZCBNb2RlbCA4IENvbXBhcmlzb24KCmFub3ZhKFZBU19Nb2RlbDcsIFZBU19Nb2RlbDgpCgoKYGBgCgojIyMgTW9kZWwgOQoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDkKClZBU19Nb2RlbDkgPC0gbG0oVkFTIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iICsgCiAgICAgICAgICAgICAgICAgIEluY29vcmQgKyBJbmNvb3JkKkh1bGxfYlZTRF8yNSArIEluY29vcmQqSHVsbF9iVlNEXzc1ICsgSW5jb29yZCpIdWxsX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCA5IEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfTW9kZWw5KQoKIyMgTW9kZWwgOSBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbDkpCgojIyBNb2RlbCA4IGFuZCBNb2RlbCA5IENvbXBhcmlzb24KCmFub3ZhKFZBU19Nb2RlbDgsIFZBU19Nb2RlbDkpCgpgYGAKCiMjIyBNb2RlbCAxMAoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDEwCgpWQVNfTW9kZWwxMCA8LSBsbShWQVMgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUgKyBIdWxsX2IgKyBWU0FfYiArIHZvd2VsX0VEX2IgKyAKICAgICAgICAgICAgICAgICAgSW5jb29yZCArIEluY29vcmQqSHVsbF9iVlNEXzI1ICsgSW5jb29yZCpIdWxsX2JWU0RfNzUgKyBJbmNvb3JkKkh1bGxfYiArIEluY29vcmQqVlNBX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCAxMCBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoVkFTX01vZGVsMTApCgojIyBNb2RlbCAxMCBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbDEwKQoKIyMgTW9kZWwgOSBhbmQgTW9kZWwgMTAgQ29tcGFyaXNvbgoKYW5vdmEoVkFTX01vZGVsOSwgVkFTX01vZGVsMTApCgpgYGAKIyMjIE1vZGVsIDExCgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgMTEKClZBU19Nb2RlbDExIDwtIGxtKFZBUyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiArIFZTQV9iICsgdm93ZWxfRURfYiArIAogICAgICAgICAgICAgICAgICBJbmNvb3JkICsgSW5jb29yZCpIdWxsX2JWU0RfMjUgKyBJbmNvb3JkKkh1bGxfYlZTRF83NSArIEluY29vcmQqSHVsbF9iICsgSW5jb29yZCpWU0FfYiArIEluY29vcmQqdm93ZWxfRURfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDExIEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfTW9kZWwxMSkKCiMjIE1vZGVsIDExIFN1bW1hcnkKCnN1bW1hcnkoVkFTX01vZGVsMTEpCgojIyBNb2RlbCAxMCBhbmQgTW9kZWwgMTEgQ29tcGFyaXNvbgoKYW5vdmEoVkFTX01vZGVsMTAsIFZBU19Nb2RlbDExKQoKYGBgCgojIyMgTmV3IEZpbmFsIFZBUyBNb2RlbAoKU2luY2UgVkFTIE1vZGVsIDYgd2FzIHNpZ25pZmljYW50bHkgYmV0dGVyIGZpdCB0aGFuIE1vZGVsIDUsIHdlIGZpdCBhIG5ldyBmaW5hbCBwYXJzaW1vbmlvdXMgbW9kZWwgZm9yIFZBUyB0byB0aGUgZGF0YSAoVkFTIH4gVlNBX2IgKyBJbmNvb3JkKSBhbmQgY29tcGFyZWQgdGhhdCB0byB0aGUgb2xkIGZpbmFsIFZBUyBtb2RlbCAoVkFTIH4gVlNBX2IpLiBUaGUgbmV3IGZpbmFsIG1vZGVsIHdhcyBub3QgYSBzaWduaWZpY2FudGx5IGJldHRlciBmaXQgdGhhbiB0aGUgb2xkIGZpbmFsIG1vZGVsLiBUaHVzIHRoZSBvbGQgZmluYWwgbW9kZWwgKFZBUyB+IFZTQV9iKSBpcyByZXRhaW5lZC4KCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBOZXcgRmluYWwgVkFTIE1vZGVsCgpWQVNfTW9kZWxfbmV3ZmluYWwgPC0gbG0oVkFTIH4gVlNBX2IgKyBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTmV3IEZpbmFsIFZBUyBNb2RlbCBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoVkFTX01vZGVsX25ld2ZpbmFsKQoKIyMgTmV3IEZpbmFsIFZBUyBNb2RlbCBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbF9uZXdmaW5hbCkKCiMjIENvbXBhcmlzb24gdG8gT2xkIEZpbmFsIE1vZGVsCgphbm92YShWQVNfTW9kZWxfZmluYWwsIFZBU19Nb2RlbF9uZXdmaW5hbCkKCmBgYAoKIyMgVGVzdGluZyBJbmRpdmlkdWFsIFByZWRpY3RvcnMKCkJlY2F1c2Ugc29tZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwcmVkaWN0b3JzIGFyZSBoaWdoLiBXZSBydW4gYSBzZXJpZXMgb2Ygc2ltcGxlIGxpbmVhciByZWdyZXNzaW9ucyB0byB0ZXN0IGlmIHRoZSBwcmVkaWN0b3JzIHNpZ25pZmljYW50bHkgcHJlZGljdCBlYWNoIGludGVsbGlnaWJpbGl0eSBtZWFzdXJlIG9uIHRoZWlyIG93biAoVlNEIDI1IGFuZCBWU0EgbW9kZWxzIHdlcmUgYWxyZWFkeSBjb21wbGV0ZSBpbiBvdXIgaW5pdGlhbCBtb2RlbCBjb21wYXJpc29uIGFwcHJvYWNoKQoKIyMjIE9ydGhvZ3JhcGhpYyBUcmFuc2NyaXB0aW9uIE1vZGVscwoKYGBge3J9CgojIE9UIH4gVlNEIDc1CgpPVF92c2Q3NV9tb2RlbCA8LSBsbSh0cmFuc0FjYyB+IEh1bGxfYlZTRF83NSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX3ZzZDc1X21vZGVsKQpzdW1tYXJ5KE9UX3ZzZDc1X21vZGVsKQoKIyBPVCB+IEh1bGwKCk9UX2h1bGxfbW9kZWwgPC0gbG0odHJhbnNBY2MgfiBIdWxsX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChPVF9odWxsX21vZGVsKQpzdW1tYXJ5KE9UX2h1bGxfbW9kZWwpCgojIE9UIH4gQ29ybmVyIERpc3BlcnNpb24KCk9UX2Rpc3BfbW9kZWwgPC0gbG0odHJhbnNBY2MgfiB2b3dlbF9FRF9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoT1RfZGlzcF9tb2RlbCkKc3VtbWFyeShPVF9kaXNwX21vZGVsKQoKYGBgCgojIyMgVkFTIE1vZGVscwoKYGBge3J9CgojIFZBUyB+IFZTRCA3NQoKVkFTX3ZzZDc1X21vZGVsIDwtIGxtKFZBUyB+IEh1bGxfYlZTRF83NSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU192c2Q3NV9tb2RlbCkKc3VtbWFyeShWQVNfdnNkNzVfbW9kZWwpCgojIFZBUyB+IEh1bGwKClZBU19odWxsX21vZGVsIDwtIGxtKFZBUyB+IEh1bGxfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU19odWxsX21vZGVsKQpzdW1tYXJ5KFZBU19odWxsX21vZGVsKQoKIyBWQVMgfiBDb3JuZXIgRGlzcGVyc2lvbgoKVkFTX2Rpc3BfbW9kZWwgPC0gbG0oVkFTIH4gdm93ZWxfRURfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU19kaXNwX21vZGVsKQpzdW1tYXJ5KFZBU19kaXNwX21vZGVsKQoKCmBgYAojIExpc3RlbmVyIERlbW9ncmFwaGljIEluZm9ybWF0aW9uCgpgYGB7cn0KCkxpc3RlbmVyRGVtbyA8LSBMaXN0ZW5lcnMgJT4lCiAgZnVybml0dXJlOjp0YWJsZTEoYWdlLCBnZW5kZXIsIHJhY2UsIGV0aG5pY2l0eSkKCkxpc3RlbmVyRGVtbwoKYGBgCgojIFNwZWFrZXIgRGVtb2dyYXBoaWNzCgpgYGB7cn0KClNwZWFrZXJEZW1vIDwtIEFjb3VzdGljRGF0YSAlPiUKICBkcGx5cjo6c2VsZWN0KGMoU3BlYWtlciwgU2V4LCBFdGlvbG9neSkpCgpBZ2VzIDwtIHJpbzo6aW1wb3J0KCJQcmVwcGVkIERhdGEvU3BlYWtlciBBZ2VzLnhsc3giKQoKU3BlYWtlckRlbW8gPC0gZnVsbF9qb2luKFNwZWFrZXJEZW1vLCBBZ2VzLCBieSA9ICJTcGVha2VyIikKClNwZWFrZXJEZW1vSW5mbyA8LSBTcGVha2VyRGVtbyAlPiUKICBmdXJuaXR1cmU6OnRhYmxlMShTZXgsIEV0aW9sb2d5LCBBZ2UsIG5hLnJtID0gRikKClNwZWFrZXJEZW1vSW5mbwoKU3BlYWtlckRlbW8gJT4lCiAgZHBseXI6OnN1bW1hcml6ZShtZWFuX2FnZSA9IG1lYW4oQWdlLCBuYS5ybSA9IFQpLCBhZ2Vfc2QgPSBzZChBZ2UsIG5hLnJtID0gVCksIGFnZV9yYW5nZSA9IHJhbmdlKEFnZSwgbmEucm0gPSBUKSkKCmBgYAoK